2014-03-28 654 views
0

我有一個像下面這樣的查詢,它工作正常。在sql查詢的同一張表上使用兩個JOIN

SELECT 
    "A".id AS A_id, 
    "B".id AS B_id, 
    "C".id AS C_id, 
    "D".id AS D_id, 
    "E".id AS E_id, 
    "F".id AS F_id, 
    "G".id AS G_id, 
    "H".id AS H_id, 
    "I".id AS I_id 
FROM "A" 
INNER JOIN "B" ON "A".id = "B".A_id 
INNER JOIN "C" ON "B".C_id = "C".id 
INNER JOIN "D" ON "C".D_id = "D".id 
INNER JOIN "E" ON "D".id = "E".D_id 
INNER JOIN "F" ON "E".F_id = "F".id 
INNER JOIN "G" ON "F".G_id = "G".id 
INNER JOIN "H" ON "G".id = "H".G_id 
INNER JOIN "I" ON "H".I_id = "I".id; 

現在我想補充一些特殊情況。表「B」與另一個表 連接,我必須添加特殊連接(完全連接),但在所有連接後。類似下面 (它`不工作,當然):

SELECT 
    "A".id AS A_id, 
    "B".id AS B_id, 
    "C".id AS C_id, 
    "D".id AS D_id, 
    "E".id AS E_id, 
    "F".id AS F_id, 
    "G".id AS G_id, 
    "H".id AS H_id, 
    "I".id AS I_id, 
    "Setup".id AS setup_id, 
    "Run".id AS run_id 
FROM "A" 
INNER JOIN "B" ON "A".id = "B".A_id 
INNER JOIN "C" ON "B".C_id = "C".id 
INNER JOIN "D" ON "C".D_id = "D".id 
INNER JOIN "E" ON "D".id = "E".D_id 
INNER JOIN "F" ON "E".F_id = "F".id 
INNER JOIN "G" ON "F".G_id = "G".id 
INNER JOIN "H" ON "G".id = "H".G_id 
INNER JOIN "I" ON "H".I_id = "I".id 

AND FROM 
"Setup" 
FULL JOIN "Run" ON "Setup".id = "Run".id 
FULL JOIN "B" ON "Setup".id = "B".id; 

我採用全連接,因爲每個表中的「運行」和「設置」僅包括一個行,但用表「B」所連接已經有了更多的一行,我想要把它們全部放在結果表中。

如何修復?也許嘗試在select中使用select?

+0

我不明白。每個B rechord只有一個設置記錄?每個設置記錄只有一個運行記錄?然後只需使用內部連接,就是這樣。 –

+1

您可能需要'LEFT JOIN'這些表,而不是完整的聯接。 –

回答

2

您不需要完全連接就可以獲得多行反映在您描述的1對多關係中。另一個內部聯接。沒有「從...」建設。您可以直接簡單地添加連接。

INNER JOIN "I" ON "H".I_id = "I".id 
INNER JOIN "Setup" ON "B".id = "Setup".id; 
INNER JOIN "Run" ON "Setup".id = "Run".id 

您應該可以在joins上看到。

[編輯]

評論表示數據是不對稱的,使得你需要一個外部聯接,所以:

INNER JOIN "I" ON "H".I_id = "I".id 
LEFT JOIN "Setup" ON "B".id = "Setup".id; 
LEFT JOIN "Run" ON "Setup".id = "Run".id 
+2

我認爲他需要左連接。 –

+0

我認爲這是第一次,但是當我仔細閱讀時,我認爲它只是內部連接。我可能是錯的。 –

+0

我可以使用LEFT或FULL加入。以上答案幫助我。帶INNER JOIN的結果 是 'tombinput_id | setup_id | run_id -------------- + ---------- + -------- 1 | 1 | 1' 與全部或左連接是 'tombinput_id | setup_id | run_id -------------- + ---------- + -------- 4 | | 1 | 1 | 1 2 | | 3 | | ' 沒有選擇一些領域更透明的看法。 – andrew