Эффективный множественный выбор в одном сохраненном процессе - PullRequest
0 голосов
/ 27 июня 2011

Мне нужно создать хранимый процесс, который возвращает два набора результатов.Второй набор содержит записи, которые связаны с записями в первом наборе посредством отношения родитель / потомок.

Например, первый оператор возвращает заказы:

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 голосов
/ 08 июля 2011

Я думаю, что лучшим способом здесь будет использование CTE (Common Table Expression).

Синтаксис для того же:

;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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...