不同之處在於條件是邏輯評估的地方,反過來又會影響結果集。
在你的例子(重新格式化),您有:
實施例1
SELECT COUNT(*)
FROM A LEFT JOIN B ON a.id = b.id
WHERE a.status = 2 AND b.id is NULL
實施例2
SELECT COUNT(*)
FROM A LEFT JOIN B ON a.id = b.id AND a.status = 2
WHERE b.id is NULL
在第一種情況中,LEFT JOIN被施加並生成結果集;然後使用WHERE子句中的兩個條件對其進行過濾。
在第二種情況下,LEFT JOIN由a.status
上的篩選條件構成,並且在某些情況下可能會從LEFT JOIN更改結果集。然後使用主WHERE子句過濾此結果集。
實施例2基本上等同於:
實施例2A
SELECT COUNT(*)
FROM (SELECT * FROM A WHERE a.status = 2) AS A
LEFT JOIN B ON a.id = b.id
WHERE b.id is NULL
對於某些查詢(但可能不是這樣的一個),差異可以無關緊要。
讓我們嘗試創建一些簡單的示例數據:
Table A Table B
id status id
4 2 1
5 3
實施例1將具有中間結果集:
a.id a.status b.id
4 2 null
5 3 null
和WHERE子句消除的第二行。
實施例2將具有中間結果集:
a.id a.status b.id
4 2 null
在本例中,最終結果是一樣的,並且我還沒有能夠拿出數據不結束的相同。
如果四處移動的查詢條件位於外連接表上並且比簡單的相等性更復雜,則可以看到效果。
我明白了,所以查詢1更好。我正確地假設,如果它是「B.status = 2」,那麼它將在你的query2的例子1中存在()子句,所以(SELECT * from b WHERE a.id a = b.id AND b。狀態= 2)? – edelwater 2012-02-27 00:08:32
查詢1和2不同,它們返回不同的結果。查詢1不是更好,但更常見。在實際情況下,我從來沒有遇到過Query2類型。 – 2012-02-27 00:10:19
是的,對於第二個問題,一個'b.status = 2'條件會顯着改變事物。這是非常普遍的情況(並且讓它與左連接一起工作,您將該條件放在「ON」部分中)。 – 2012-02-27 00:12:05