2014-09-29 55 views
0

好,所以我的問題是:根據AND語句在查詢中的位置在記錄計數方面存在差異。例如,如果我有幾個INNER JOINS和一對LEFT JOIN,並且在查詢的最後,如果我放置所有AND語句,則記錄數是不同的,如果我將AND語句放在匹配的JOIN表下。由於AND語句指定了表,爲什麼它放在查詢中的位置很重要?爲什麼AND語句放置會影響記錄計數

實施例1:

FROM table (nolock) 
INNER JOIN table2 (nolock) ON Table.ID = table2.ID 
INNER JOIN table3 (nolock) ON table2.ID = table3.ID 
LEFT JOIN table4 (nolock) ON table3.ID = table4.ID 
where table.vendor = 1234 
AND table.Active = 1 
And table2.Active = 1 
And table3.Active = 1 
and table4.Active = 1 
and table3.Name LIKE 'someName' 

實施例2:

FROM table (nolock) 

INNER JOIN table2 (nolock) ON Table.ID = table2.ID 
And table2.Active = 1 
INNER JOIN table3 (nolock) ON table2.ID = table3.ID 
And table3.Active = 1 
and table3.Name LIKE 'someName' 
LEFT JOIN table4 (nolock) ON table3.ID = table4.ID 
where table.vendor = 1234 
and table4.Active = 1 
AND table.Active = 1 
+0

我不相信這是可能的。優化器在執行之前將所有的'ON'謂詞移動到'WHERE'以用於'INNER JOIN'。 – zerkms 2014-09-29 19:45:14

+0

你的邏輯條件是不同的。例如,第二個片段缺少'table4.Name LIKE'someName''。 – 2014-09-29 19:45:19

+3

你能寫出真正的「等價」查詢嗎? (或者至少,你正在使用的條件)。 '從表和表。活動= 1'?,這是沒有道理的。在第一個例子中,你使用'和table4.Name LIKE'someName'',第二個使用'table3.Name LIKE'someName''。 PLease,花點時間寫出正確的查詢 – Lamak 2014-09-29 19:45:29

回答

3

當使用INNER JOIN沒有區別的標準是否伴隨JOIN,或者如果它是WHERE子句中,然而與LEFT JOIN加入加入條件不會過濾掉非連接記錄,但WHERE子句中的條件將排除非連接記錄。在你的情況下,WHERE table4.Active = 1從表4中排除非連接記錄,但將該條件移動到JOIN不會排除這些記錄。

下面是一個簡單的例子:SQL Fiddle

注:我做了你的示例代碼是不完全正確的假設,這是根據您的描述的問題。

+0

答案中有一個細節不一定是正確的。 「使用'LEFT JOIN'添加連接條件不會減少返回的記錄數量」,如果例如存在具有第一個連接條件的重複行,則添加連接條件可以減少返回的行數 – Lamak 2014-09-29 19:57:36

+0

@lamak更新了措辭,它看起來更清楚嗎? – 2014-09-29 20:00:11

+0

它的確如此,至少對我來說 – Lamak 2014-09-29 20:01:58

相關問題