2012-11-15 87 views
2

我遇到了一個SQL Server中的較大查詢的問題,我追溯到未按預期執行的代碼段。SQL Server重寫左連接

SELECT item_name,item_num,rst_units 
FROM tbl_item left join tbl_sales_regional on item_num=rst_item 
WHERE rst_month=7 and rst_customer='AB123' 

第一個表(tbl_item)有10,000條記錄。第二個表格(tbl_sales_regional)的顯示標準爲83。

執行計劃顯示SQL Server已重寫爲內部聯接,並返回83個結果,而不是返回10,000個帶有9,917個空值的記錄。

爲了達到預期的效果,我必須加入子查詢。有人可以提供解釋爲什麼這不起作用嗎?

+1

http://stackoverflow.com/questions/354070/sql-join-where-clause-vs-on-clause – Pondlife

回答

4

不確定哪些字段屬於哪個字段,但您的WHERE條件中似乎有一些來自tbl_sales_regional的字段。

移動到該ON條款:

SELECT item_name, item_num, rst_units 
FROM tbl_item 
LEFT JOIN 
     tbl_sales_regional 
ON  rst_item = item_num 
     AND rst_month = 7 
     AND rst_customer = 'AB123' 

WHERE子句的加入使結果操作這些條件不可能舉行真正用於任何NULL記錄由聯接返回tbl_sales_regional,爲NULL不能等於任何東西。

這就是優化器將您的查詢轉換爲內部聯接的原因。

+0

謝謝你的澄清 – ElPresidente

3

無論左連接如何,您都可以應用您在WHERE子句中的任何條件,從而使其成爲內連接。

您需要將其更改爲:

SELECT item_name,item_num,rst_units 
FROM tbl_item left join tbl_sales_regional on item_num=rst_item 
AND rst_month=7 and rst_customer='AB123' 
+0

是有辦法做到這一點,當我不知道rst_month或rst_customer參數之前?例如。我嘗試將左連接放入視圖中,因此只能在視圖執行左連接後才能附加參數,而參數get只能應用於where子句 – Philipp

+0

@Pilipp,最簡單的方法是使用存儲過程而不是一個看法。但我認爲這是不可行的(或者至少是理想的),所以只有少數人能夠想到做到這一點的唯一方法就是在視圖的討論中考慮可能缺失的數據表(即'WHERE(RightTable.Id IS NULL或RightTable.SomeFilter ='MyValue')。 –