2014-06-30 122 views
0

我被給予別人的代碼連接9(!)表 - 我過去沒有使用過它,但現在所有的表都隨着時間增長,所以我收到奇怪的空間錯誤。單個語句中的多個內部連接與pairwise連接

我得到了建議,打破了連接,並做了多對配對連接。應該很簡單,因爲所有的連接都是內在的,我讀的所有內容都表明順序在這種情況下應該沒有什麼區別 - 但是我得到的數量與我應該的數量不同。沒有給出任何特定的非常複雜的例子,這有什麼可能的原因?

感謝

+0

你是什麼意思兩兩連接。 – Hogan

+2

加入9張表並不是很多。 – Hogan

+0

「奇怪的空間錯誤」是什麼意思? – Hogan

回答

0

To me, joining 9 tables in a single statement is a lot! Pairwise may have been imprecise - I mean joining two tables then joining that result to another table, then that result to another table. Obviously they are ordered to the degree that the necessary key is available at each point.

這不明擺着給我。事實上,這不是事實。 MOST SQL平臺(並且你還沒有說出你正在使用哪一個)編譯SQL語句並形成一個執行計劃。當連接執行時,該計劃將優化並移動。在許多並行運行的系統上,它們將同時執行聯接。

理解語句「順序」的方法是查看執行計劃。

控制訂單(在許多系統上)的方法是使用CTE。事情是這樣的:

WITH subsetofbigtable AS 
(
    SELECT * 
    FROM reallybigtable 
    WHERE date = '2014-01-01' 
) 
SELECT * 
FROM subsetofbigtable 
JOIN anothertable1 ... 
JOIN anothertable2 ... 
JOIN anothertable3 ... 
JOIN anothertable4 ... 
JOIN anothertable5 ... 

你也可以連接熱膨脹係數以「訂單」加入:

WITH subsetofbigtable AS 
(
    SELECT * 
    FROM reallybigtable 
    WHERE date = '2014-01-01' 
), chain1 AS 
(
    SELECT * 
    FROM subsetofbigtable 
    JOIN anothertable1 ... 
), chain2 AS 
(
    SELECT * 
    FROM chain1 
    JOIN anothertable2 ... 
) 
SELECT * 
FROM chain2 
JOIN anothertable3 ... 
JOIN anothertable4 ... 
JOIN anothertable5 ... 
+0

該平臺是UNIX。我明白,優化發生在一個單一的聲明,以便多個連接將被優化 - 即使如此,我有空間問題。所以當我試圖打破連接並使用多個語句時,我只能加入任何我在此處具有密鑰的表。 – user3791254

+0

@ user3791254 - UNIX ..很好。但沒有幫助。你在使用DB2,Oracle,MySQL嗎?什麼是你的** SQL **平臺。 – Hogan

+0

DB2 ...不熟悉「鏈接」 – user3791254