我需要创建一个返回两个结果集的存储过程。第二组包含通过父/子关系与第一组记录相关的记录。
例如,第一个语句返回订单:
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和表变量会变得相当复杂。有什么更好的方法来解决这个问题?
答案 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