2010-03-25 207 views
4

在SQL Server 2008:如何避免SQL中的重複子查詢JOIN?

我有一個表,我想大意如下做些什麼:

SELECT T1.stuff, T2.morestuff from 
(
SELECT code, date1, date2 from Table 
) as T1 
INNER JOIN 
(
SELECT code, date1, date2 from Table 
) as T2 

ON T1.code = T2.code and T1.date1 = T2.date2 

,這兩個子查詢完全相同。有沒有什麼辦法可以做到這一點,而無需重複子查詢腳本?

感謝

卡爾

回答

7

CTE:

;WITH YourQuery AS 
(
SELECT code, date1, date2 from Table 
) 
SELECT 
    T1.stuff, T2.morestuff 
    from YourQuery   T1 
     INNER JOIN YourQuery T2 ON T1.code = T2.code and T1.date1 = T2.date2 

FYI

在這個問題中,代碼使用派生表,也稱爲內聯視圖。子查詢是一個SELECT查詢,它返回單個值並嵌套在SELECT,INSERT,UPDATE或DELETE語句中或另一個子查詢中。子查詢可以在允許表達式的任何地方使用。請參閱:http://msdn.microsoft.com/en-us/library/aa213252(SQL.80).aspx

+0

謝謝。我希望有一個性能增益 - 或者它只是清理代碼? 「YourQuery」僅執行一次,還是每次您從YourQuery調用SELECT ...時都會重新執行計算? – Karl 2010-03-26 13:09:50

+2

我認爲它可以在每次使用時重新評估CTE,但這是確保最好的方法:在SQL Server Management Studio中,運行以下命令:SET SETPLAN_ALL ON,然後運行原始查詢。您的查詢將不會運行,但執行計劃將顯示,請查看包含「select」的第一行的'TotalSubtreeCost'列。運行查詢的CTE版本,並再次查看'TotalSubtreeCost'列。有很大的區別嗎?如果沒有,那麼它可能重新評估它。您可以查看實際的計劃行,並查看SQL Server如何將您的查詢分解爲要處理的步驟。 – 2010-03-26 13:41:22

0

您可以使用視圖。

CREATE VIEW myView AS 
SELECT code, date1, date2 
FROM Table 

然後你的查詢將是這樣的:

SELECT T1.stuff, T2.morestuff 
FROM myView as T1 
INNER JOIN myView as T2 ON T1.code = T2.code and T1.date1 = T2.date2 
0

爲什麼它們是子查詢?

SELECT T1.stuff, T2.morestuff 
FROM Table T1 
INNER JOIN Table T2 
ON T1.code = T2.code and T1.date1 = T2.date2 
+1

'爲什麼它們是子查詢?'也許OP的實際查詢比問題中列出的要複雜得多。 – 2010-03-25 13:56:32

0

爲什麼兩次鋸齒表不會工作?

SELECT T1.stuff, T2.stuff FROM Table as T1 INNER JOIN Table as T2 
ON T1.code = T2.code and T1.date1 = T2.date2