Mic*_*elD 2 sql sql-server stored-procedures
我正在编写一个存储过程来获取整个屏幕的数据.如何重新使用一个选择的结果进入第二个选择?这是出于性能原因
简化示例:我有4个表
存储过程获取caseid以检索数据
首先选择获得的细节case
,group
及其相关responsible
的记录:
select
Case.Date,
Case.Name,
Group.Name,
Responsible.Name
Responsible.ResponsibleID
from Case
inner join Group on Group.GroupID=Case.GroupID
inner join Responsible on Responsible.ResponsibleID=Group.ResponsibleID
where CaseID=@CaseID
Run Code Online (Sandbox Code Playgroud)
第二个选择必须获取负责人所分配的所有操作.我们只有caseID,因此我们必须重新构建连接:
select Action.*
from Case
inner join Group on Group.GroupID=Case.GroupID
inner join Responsible on Responsible.ResponsibleID=Group.ResponsibleID
inner join Action on Action.ResponsibleID=Responsible.ResponsibleID
where CaseID=@CaseID
Run Code Online (Sandbox Code Playgroud)
如果可以重用上一个结果中的变量,则可以创建以下查询,这可能对性能更好:
Select * from Action where ResponsibleID={ResultSet1}.ResponsibleID
Run Code Online (Sandbox Code Playgroud)
考虑将结果保存在表变量中.这将允许您从永久表中对该结果集执行多个SQL操作.
DECLARE @Case TABLE
(
[CaseDate] datetime,
[CaseName] varchar(100),
[GroupName] varchar(100),
[ResponsibleName] varchar(100),
[ResponsibleID] int
)
--get all your case details
INSERT INTO @Case( [CaseDate],[CaseName],
[GroupName],[ResponsibleName],[ResponsibleID])
SELECT
Case.Date,
Case.Name,
Group.Name,
Responsible.Name
Responsible.ResponsibleID
FROM Case
INNER JOIN Group ON Group.GroupID=Case.GroupID
INNER JOIN Responsible ON Responsible.ResponsibleID=Group.ResponsibleID
WHERE CaseID=@CaseID
--now get the Action details for the previous case;
--are we absolutely sure there is only one row? then an INNER JOIN
SELECT A.*
FROM Action AS [A]
INNER JOIN @Case AS C ON A.ResponsibleID=C.ResponsibleID
-- or guard against multiple results in @Case
SELECT A.* FROM Action AS [A]
WHERE A.ResponsibleID = (SELECT TOP 1 ResponsibleID FROM @Case)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1505 次 |
最近记录: |