2

我在 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 个用于显示的标准。

执行计划不是返回 10,000 条记录和 9,917 个空值,而是显示 SQL Server 已重写为内部连接,因此返回 83 个结果。

为了达到预期的结果,我必须加入一个子查询。有人可以解释为什么这不起作用吗?

4

2 回答 2

4

不确定哪些字段属于哪里,但您的情况似乎有一些tbl_sales_regional字段WHERE

将它们移动到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这些条件不可能成立,因为不能等于任何东西。NULLtbl_sales_regionalNULL

这就是优化器将您的查询转换为内部联接的原因。

于 2012-11-15T17:59:30.693 回答
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' 
于 2012-11-15T18:00:13.933 回答