Как создать псевдоним для запроса в SP и использовать результат на протяжении всей процедуры - PullRequest
1 голос
/ 27 марта 2012

m написание хранимой процедуры, в которой у меня есть 4 запроса на выборку

Я хочу, чтобы некоторые данные из первого запроса на выборку использовались в предложении where из остальных трех запросов.

SELECT TOP 100 * FROM dbo.[Order] WHERE (dbo.[Order].[CreatedOn]<(GetDate()-7)) AND ((@OrderId IS NULL)OR(dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100))) ORDER BY dbo.[Order].[OrderId]

SELECT * FROM dbo.[OrderItem] WHERE  dbo.[OrderItem].[OrderId] IN(SELECT TOP 100 dbo.[Order].[OrderId] FROM dbo.[Order] WHERE (dbo.[Order].[CreatedOn]<(GetDate()-7)) AND ((@OrderId IS NULL)OR(dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100))))

SELECT  dbo.OrderItemAddOn.* FROM dbo.OrderItemAddOn INNER JOIN dbo.MenuItemAddOn ON dbo.OrderItemAddOn.MenuItemAddOnId = dbo.MenuItemAddOn.MenuItemAddOnId           
   INNER JOIN dbo.MenuAddOn ON dbo.MenuItemAddOn.MenuAddOnId = dbo.MenuAddOn.MenuAddOnId          
   INNER JOIN dbo.OrderItem ON dbo.OrderItemAddOn.OrderItemId = dbo.OrderItem.OrderItemId  
   AND dbo.OrderItem.OrderId IN(SELECT TOP 100 dbo.[Order].[OrderId] FROM dbo.[Order] WHERE (dbo.[Order].[CreatedOn]<(GetDate()-7)) AND ((@OrderId IS NULL)OR(dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100)))) ORDER BY dbo.OrderItemAddOn.OrderItemAddOnId, dbo.OrderItemAddOn.OrderItemId            

SELECT DISTINCT * FROM    dbo.OrderItemModifier INNER JOIN dbo.OrderItem ON dbo.OrderItemModifier.OrderItemId = dbo.OrderItem.OrderItemId 
    AND dbo.OrderItem.OrderId IN (SELECT TOP 100 dbo.[Order].[OrderId] FROM dbo.[Order] WHERE (dbo.[Order].[CreatedOn]<(GetDate()-7)) AND ((@OrderId IS NULL)OR(dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100))))          
    LEFT OUTER JOIN dbo.MenuModifierGroup ON dbo.OrderItemModifier.MenuModifierGroupId = dbo.MenuModifierGroup.MenuModifierGroupId ORDER BY OrderItemModifier.OrderItemId

Есливы замечаете, что этот запрос

SELECT OrderId FROM dbo.[Order] WHERE (dbo.[Order].[CreatedOn]<(GetDate()-7)) AND ((@OrderId IS NULL)OR(dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100))) ORDER BY dbo.[Order].[OrderId]

повторяется, так как я хочу, чтобы идентификаторы заказов были из этого запроса.вышеприведенные запросы, безусловно, неправильный подход. Я хочу создать псевдоним этого запроса и использовать один и тот же результат во всех моих запросах. Можете ли вы, ребята, помочь.

что мы можем сделать, это создать псевдоним этого запроса и использовать один и тот же результат во всех четырех запросах ... это тоже хорошее решение ... но как псевдонимы запросов в SP ..

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Есть несколько вариантов, которые вы можете исследовать:

  • Темп столы
  • Таблица значений переменных
  • View
  • Общее табличное выражение
  • UDF или хранимая процедура, возвращающая таблицу

Хотя я не могу рассказать слишком много о вашем случае из предоставленных вами запросов, простой отправной точкой будет временная таблица с именем #recent_orders для хранения результатов вашего подзапроса:

SELECT TOP 100 * FROM dbo.[Order] 
INTO #recent_orders
WHERE (dbo.[Order].[CreatedOn]<(GetDate()-7)) 
AND (
   (@OrderId IS NULL)
    OR
   (dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100))
) 
ORDER BY dbo.[Order].[OrderId]

Затем вы можете ссылаться на него в последующих запросах, например:

SELECT * FROM dbo.[OrderItem]
WHERE  dbo.[OrderItem].[OrderId] IN(SELECT [OrderId] FROM #recent_orders)
0 голосов
/ 27 марта 2012

Если запрос, который вы хотите использовать для псевдонима, используется в разных хранимых процедурах, одним из решений является использование встроенных табличных функций .В вашем случае:

CREATE GetOrderID(@Date Date, @OrderId INT)
RETURNS TABLE
AS
RETURN (
SELECT OrderId FROM dbo.[Order] WHERE (dbo.[Order].[CreatedOn]<(@Date-7)) AND ((@OrderId IS NULL)OR(dbo.[Order].[OrderId] BETWEEN (@OrderId) AND (@orderId+100))) ORDER BY dbo.[Order].[OrderId]
)

Теперь вы можете использовать эту функцию (например, последний запрос):

SELECT DISTINCT * FROM    dbo.OrderItemModifier INNER JOIN dbo.OrderItem ON dbo.OrderItemModifier.OrderItemId = dbo.OrderItem.OrderItemId 
    AND dbo.OrderItem.OrderId IN (SELECT TOP 100 FROM dbo.GetOrderID(GetDate(), @OrderID))          
    LEFT OUTER JOIN dbo.MenuModifierGroup ON dbo.OrderItemModifier.MenuModifierGroupId = dbo.MenuModifierGroup.MenuModifierGroupId ORDER BY OrderItemModifier.OrderItemId

Извините, я не тестировал этот код, простонапример.

0 голосов
/ 27 марта 2012
select column_1 into #tmp_first_result
from FIRST_QUERY WHERE ....


select *
from SECOND_QUERY INNER JOIN #tmp_first_result T ON (......)

Вы можете повторно использовать #tmp_first_result для любого другого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...