2012年6月7日星期四

INNER JOIN大不同


在使用LEFT JOIN時,遇到了結果不對的問題。
在StackOverflow找到了答案:http://stackoverflow.com/q/354070/822864


使用StackOverflow上的例子解釋一下。

以下兩句SQL回來的結果,看來是一樣。而且例子1在JOIN的條件上已有Orders.ID=12345這個名似是一個篩選條件,想來合併速度定必更快。

例子1:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID AND Orders.ID=12345



例子2:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345



但事實並非如此。

例子1的執行結果會把OrderLines裡的記錄全都合併進去,而只有符合OrderLines.OrderID=Orders.ID和Orders.ID=12345這兩個條件的才會被連結成一個記錄。

而例子2則能輸出我想要的結果:把兩個表格合併並只出現Orders.ID = 12345的記錄。

根據現代的資料庫,他們一般也有優化SQL邏輯的能力。這種老掉牙JOIN語法,優化器是種得把集合處理好的。



*測試和使用環境是Oracle Enterprise Database 11g Release 2

沒有留言:

發佈留言