0

我没有从下面的查询中得到预期的结果。我期望获得 5,262 条记录,而我只获得 4,279 条记录。我知道问题出在 WHERE 子句上。当我注释掉 WHERE 子句时,我得到了预期的记录数,但数量不正确,因为我需要过滤 Type 字段。有什么建议么?

SELECT
    a.Part,
    SUM(ISNULL(b.Qty,0)) AS Sales_Qty
FROM
    dbo.Parts a
    LEFT OUTER JOIN dbo.Sales b ON b.Part = a.Part
WHERE
    b.Type = 'O'
GROUP BY
    a.Part
ORDER BY
    a.Part
4

2 回答 2

6

如果您在子句中 a (在本例中为)右侧的表中的列上LEFT JOIN设置条件,您将删除所有不符合条件的结果行,而不是将缺失值设置为。bWHERENULL

相反,把它放在ON从句中;

SELECT
    a.Part,
    SUM(ISNULL(b.Qty,0)) AS Sales_Qty
FROM
    dbo.Parts a
    LEFT OUTER JOIN dbo.Sales b ON b.Part = a.Part AND b.Type = 'O'
GROUP BY
    a.Part
ORDER BY
    a.Part
于 2013-05-23T20:19:01.490 回答
3

由于您已将过滤器放在 WHERE 子句中,因此您基本上是在执行 INNER JOIN,它只会返回两个表中的匹配行,请尝试将过滤器移动到 JOIN:

SELECT a.Part,
   SUM(ISNULL(b.Qty,0)) AS Sales_Qty
FROM dbo.Parts a
LEFT OUTER JOIN dbo.Sales b 
   ON b.Part = a.Part
   AND b.Type = 'O'
GROUP BY a.Part
ORDER BY a.Part
于 2013-05-23T20:18:41.133 回答