2014-06-25 66 views
0

我一直在尋找一個老式學院SQL和基於一些語法,我以前沒有使用過,並且沒有認識都有所涉獵..的Oracle SQL左連接,其中

SELECT * FROM TABLE1 
LEFT JOIN TABLE 2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2), TABLE3 WHERE COLUMN1 LIKE '%%' 
AND TABLE2.COLUMN1 = TABLE3.COLUMN1; 

我很好的這部分聲明中,

SELECT * FROM TABLE1 
LEFT JOIN TABLE 2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2) 

但隨着加入第二部分的鬥爭,

, TABLE3 WHERE COLUMN1 LIKE '%%' 
AND TABLE2.COLUMN1 = TABLE3.COLUMN1; 

說一個能夠讓外國的概念閃耀一些光芒嗎?

我最初的猜測是逗號是一種列表加入的方式,而不是爲每個要加入的表格輸入LEFT JOIN,但我現在不確定。

乾杯。

回答

0

逗號是老風格join數十年來已經過時(但完全支持)的語法。幾乎每個人現在都更喜歡顯式的join語法。

逗號在功能上等同於cross join - 完整的笛卡爾產品。所以查詢是一樣的:

SELECT * 
FROM TABLE1 LEFT JOIN 
    TABLE 2 
    ON TABLE1.COLUMN1 = TABLE1.COLUMN2 CROSS JOIN 
    TABLE3 
WHERE COLUMN1 LIKE '%%' AND TABLE2.COLUMN1 = TABLE3.COLUMN1; 

我不會寫這樣的查詢。首先,COLUMN1 LIKE '%%'會生成錯誤,因爲TABLE1TABLE3有一個具有該名稱的列。並且,在TABLE2上沒有join條件。讓我來承擔這些錯別字,你的意思是:

SELECT * 
FROM TABLE1 LEFT JOIN 
    TABLE2 
    ON TABLE1.COLUMN1 = TABLE2.COLUMN2 CROSS JOIN 
    TABLE3 
WHERE TABLE1.COLUMN1 LIKE '%%' AND TABLE2.COLUMN1 = TABLE3.COLUMN1; 

比較TABLE2.COLUMN1 = TABLE3.COLUMN1轉動LEFT JOININNER JOIN,因爲NULL值將導致比較失敗。 TABLE3沒有外部連接。所以查詢應該等同於:

SELECT * 
FROM TABLE1 LEFT JOIN 
    TABLE2 
    ON TABLE1.COLUMN1 = TABLE2.COLUMN2 JOIN 
    TABLE3 
    ON TABLE2.COLUMN1 = TABLE3.COLUMN1 
WHERE COLUMN1 LIKE '%%' ; 
+0

你是對的,這是一個錯字! 非常感謝您的解釋。自從2000年以來,我一直認爲它是傳統的語法。 – FVCKYETI

0
  • 相反,你可以鍵入「INNER JOIN」或只是逗號的「加盟」
  • 您不必鍵入COLUMN1 LIKE '%%'它沒有過濾嘴的
  • 這是一個奇怪的查詢,左連接將無法按預期工作,因爲稍後您將TABLE2與TABLE3結合在一起(AND TABLE2.COLUMN1 = TABLE3.COLUMN1)。如果您希望在左連接的行爲,你必須把此行的子句中的左連接

按照評論下面你可以重寫此查詢是這樣的:

SELECT * 
    FROM TABLE1 
INNER JOIN TABLE3 
    LEFT JOIN TABLE2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2 AND TABLE2.COLUMN1 = TABLE3.COLUMN1) 
WHERE COLUMN1 LIKE '%%' -- you can remove this line, the resultset will be the same 
;