在单个存储过程中有效的多个选择

时间:2011-06-27 10:06:36

标签: sql stored-procedures select

我需要创建一个返回两个结果集的存储过程。第二组包含通过父/子关系与第一组记录相关的记录。

例如,第一个语句返回订单:

SELECT ID, col2, col3, ...
FROM dbo.Orders
WHERE x=y

第二个语句返回这些订单的各个项目:

SELECT ID, OrderID, col3, col4, ...
FROM dbo.OrderItems
WHERE OrderID IN (<IDs from first statement>)

我正在寻找实现这一目标的最有效方法。目前我的解决方案如下:

-- create a table variable to hold results from first statement
DECLARE @Result TABLE 
(
   ID int NOT NULL, 
   col2 nvarchar(50),
   col3 nvarchar(50)
)

-- select orders
INSERT INTO @Result (ID, col2, col3)
SELECT ID, col2, col3, ...
FROM dbo.Orders
WHERE x=y

SELECT * FROM @Result 

-- select order items corresponding to the orders in the @Result table
SELECT ID, OrderID, col3, col4
FROM dbo.OrderItems I
INNER JOIN @Result R ON R.ID = I.OrderID

这看起来效果很好。但是要求是第一个语句中的WHERE子句变得非常复杂并且适合使用CTE(WITH语句),但是同时具有WITH和表变量会变得相当复杂。有什么更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为这里最好的方法是使用CTE(公用表格式)。

相同的语法是

;With CTE as
(
   Select ...
)

您的查询应该是这样的......

;WITH @Result AS
(
   SELECT 
     ID, 
     col2, 
     col3, ...
   FROM 
    dbo.Orders
   WHERE x=y
)
SELECT 
  ID, 
  OrderID, 
  col3,
  col4
FROM 
  dbo.OrderItems I
INNER JOIN
  @Result
ON
  @Result.ID   = I.OrderID
ON