2017-06-20 104 views
0

與內部連接的查詢:左外連接返回更少的行

Select 
    O.ORDER_KEY, O.ORDER_SOURCE, 
-------, --- 
FROM 
    Table_1, Table_2, Table_3 
where 
    TABLE_1.SK = TABLE_2.SK AND TABLE_2.SK = TABLE_3.SK and many more; 

上述查詢將返回各地的10000行。

我想添加另一個表,但同時我不想丟失來自table_2的訂單。爲了達到這個目的,我使用了left_outer_join:

Select 
    O.ORDER_KEY, NVL(O.ORDER_SOURCE, WROA.ORDER_SOURCE) AS ORDER_SOURCE, 
-------, --- 
FROM 
    Table_1, Table_2, Table_3, Table_4 
where 
    TABLE_1.SK = TABLE_2.SK AND TABLE_2.SK = TABLE_3.SK AND 
    TABLE_2.ORDER = TABLE_4.ORDER(+); 

上面的查詢返回200行。

爲什麼它不返回10000行?我錯過了什麼?如何在左外連接上添加一個條件來影響多行?

+0

有加入舊語法,但此查詢是無稽之談。什麼是TABLE_2_ORDER?沒有這樣的桌子。什麼是'還有更多';?它可以有很多'(+)首先我建議重新適應正確的連接語法。然後發佈整個查詢進行分析。這是很少說什麼 – Kacper

+0

非常確定這是一個正確的加入。包含所有table4_order記錄,並且只包含table_2_order中匹配的記錄。 – xQbert

+0

「=」被認爲是內部連接,最後加上「(+)」是外部連接。對? –

回答

0

這可能是因爲你已經定義了where子句。要添加的新表,此表中的列是where子句的一部分?如果是,那麼使用該列的內聯視圖來查看它是否給你正確的結果。

+0

是的,我添加了table_4和這個條件TABLE_2.ORDER = TABLE_4.ORDER(+)是我在where子句的原始查詢中添加的唯一條件。我會嘗試內聯視圖。非常感謝。 –

+0

如果內聯視圖適合你,那麼你可以選擇ANSI加入xQbert在他的答案中提到的內容,它會給你的查詢提供優雅的外觀,並且更容易維護。我不認爲這樣的性能會受到阻礙,但它總是很適合ANSI連接語法。 –

+0

我一定會嘗試內聯視圖。它是一個非常大的查詢。需要時間來轉換它。:D –

0

這就是我說的ANSI 92 ...

SELECT O.ORDER_KEY, NVL(O.ORDER_SOURCE, WROA.ORDER_SOURCE) AS ORDER_SOURCE, ... 
FROM Table_1 
INNER JOIN Table_2 
    ON TABLE_1.SK = TABLE_2.SK 
INNER JOIN Table_3 
    ON TABLE_2.SK = TABLE_3.SK AND 
LEFT JOIN Table_4 
    ON TABLE_2.ORDER = TABLE_4.ORDER 
WHERE ... 
+0

是的,我明白並會嘗試這種方式。非常感謝。 –