2017-10-15 47 views
0

考慮下面的SQL語句這個不正確(但有效)的SQL連接甚至意味着什麼?它究竟在做什麼?

select * 
from A 
    inner join B on A.FK = B.PK 
    inner join C on A.FK = B.PK 

這顯然是不正確形成陳述。 C的連接使用B的連接條件。但是,這仍然運行。在這種情況下,口譯員如何決定加入C?爲什麼這甚至是被允許的陳述?有沒有任何情況下,像這樣的東西是可取的?

+0

它是否返回「正確」的數據?對我而言,開發人員看起來像是印刷錯誤,從不重新驗證輸出。 – Amit

+0

@Amit - 這不是一個關於具體情況的問題。我想到了這個問題,因爲事實上我做了一個複製粘貼錯誤的事情,我正在努力並糾正它。但是,我注意到SQL語句仍然運行(很長一段時間),我殺了它。問題是「它究竟在做什麼,它爲什麼被允許,並且它是否可取?」。 –

+3

優化器可隨意自由裁剪條件。所以這將相當於兩個條件(一個是真的)在WHERE部分。至於「它在做什麼」 - 笛卡爾產品就是它正在做的事情。 –

回答

1

從a到b的連接條件是重複的,只要在關鍵字後面,它在sql中的位置並不重要。我相信這是事實。

你正在做一個caterian加入到這裏加入a的結果。如果a和b連接產生15行,並且c有20,那麼結果集爲300行。

相關問題