如何在存储过程中重用结果以提供给同一存储过程中的第二个选择

Mic*_*elD 2 sql sql-server stored-procedures

我正在编写一个存储过程来获取整个屏幕的数据.如何重新使用一个选择的结果进入第二个选择?这是出于性能原因

简化示例:我有4个表

  1. 主管
  2. 行动(有责任的外键)
  3. 集团(有责任的外键)
  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)

p.c*_*ell 5

考虑将结果保存在表变量中.这将允许您从永久表中对该结果集执行多个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)