Как псевдонимировать запрос в SP и использовать результат на протяжении всей процедуры

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]

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

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


person 1Mayur    schedule 27.03.2012    source источник
comment
Вы можете сохранить результат первого запроса во временной таблице. Затем эти временные таблицы будут использоваться.   -  person Thit Lwin Oo    schedule 27.03.2012


Ответы (3)


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

  • Временные таблицы
  • Переменная табличных значений
  • Вид
  • Общее табличное выражение
  • 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)
person Mike Chamberlain    schedule 27.03.2012
comment
Хорошее объяснение, Майки.. спасибо - person 1Mayur; 27.03.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 для любого другого запроса.

person Thit Lwin Oo    schedule 27.03.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

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

person Alex_L    schedule 27.03.2012