2016-12-06 56 views
1

我想寫實現以下查詢的邏輯:SQL服務器 - 重用以前的查詢 - 相似的邏輯到LINQ

select ...... 
from (select ..... from ... complex and long query #1) R1 
    (select ..... from ... complex and long query #2) R2 
Where 
    NOT (@DateStart > R2.IstEnde OR @DateEnd <= R2.IstStart) 
OR 
(
    (select count(*) 
    from R2 // <---- BUG IS HERE 
    Where R2.IsOutsideTaskTimeFrame = 1 AND R2.IsManuallyFixed = 1 
    ) > 0 
) 
order BY R2.PersonName, R1.YearOfWeek, R1.Week 

這明顯不工作,因爲我想「再利用」的R2在「count()」的條件下。

我寫的基於「.NET Linq」邏輯,我們可以「重用」以前的查詢。

我甚至可以編寫「重複使用」前一個查詢的邏輯,而不是重複一遍嗎?

+0

我不完全確定這一點,但不是「重用」另一個詞的SQL查看概念? – hypnos

+0

你打算如何加入R1和R2?目前他們沒有加入,或者如果他們之間有逗號,那麼CROSS JOIN(所有行到所有行) – Cato

回答

7

也許你正在尋找CTE - Common Table Expression

;WITH R1 AS 
(SELECT ...) 
,R2 AS 
(SELECT ...) 
SELECT * FROM R1 
... use R1 and R2 like any other table here (it's called "derived table") 

如果你需要獨立的查詢中的結果,你可能會填補聲明表變量或臨時表。

0

您可以使用CTE來定義基本的查詢,可以在代碼的同一範圍內多次使用:

WITH Sales_CTE (returnParam1, returnParam2, ...) 
AS 
-- Define the CTE query. 
(
    select ..... from ... complex and long query #2 
)  

或者,您可以創建一個用戶定義的函數,得到PARAMS並返回結果,然後多次調用它:

CREATE FUNCTION dbo.ufnGetInventoryStock(param1 int, ...) 
RETURNS int 
AS  
RETURN ( 
    select ..... from ... complex and long query #2 
)