两个查询之间的 SQL Server 区别?

SQL Server difference between two queries?

提问人:Adele 提问时间:11/15/2023 最后编辑:marc_sAdele 更新时间:11/16/2023 访问量:65

问:

这是我的表格:

在此处输入图像描述

我有一个问题,我不明白以下两个查询之间的区别:

查询 #1:

SELECT 
    productID,
    SUM(soldQty)
FROM
    Sales
WHERE
    soldQty <> 0
GROUP BY  
    ProductID

查询 #2:

SELECT
    productID,
    SUM(soldQty)
FROM
    Sales
GROUP BY 
    ProductID
HAVING
    SUM(soldQty) <> 0

哪些将导致查询?不是一样吗?productID

sql-server

评论

0赞 Dai 11/15/2023
查询在语义上不同,但源数据隐藏了这种差异。然而,如果你有任何行,你会看到不同的结果。SoldQty = -1
3赞 Thom A 11/15/2023
提问时,请不要上传代码/数据/错误的图片。
1赞 siggemannen 11/15/2023
HAVING 过滤器是在聚合完成后执行的(逻辑上,不一定是物理上的),因此像 -6 + 6 这样的行不会在 WHERE 中被过滤,但它们会在 HAVING 中被过滤

答:

3赞 Thom A 11/15/2023 #1

查询是不一样的。第一个查询将 的值不等于 的行。SUMsoldQty0

但是,第二个查询将返回 中值的总和合计的行。因此,如果值为 ,例如 ,则这些行将被省略。对于第一个查询,情况并非如此。soldQty0SUM010-4-6

SELECT MyColumn,
       SUM(IntColumn) AS TotalIntColumn
FROM (VALUES(1,0),
            (1,2),
            (1,5),
            (1,0),
            (1,-2),
            (2,10),
            (2,-4),
            (2,-6),
            (2,0),
            (3,0))V(MyColumn,IntColumn)
WHERE IntColumn <> 0
GROUP BY MyColumn;

SELECT MyColumn,
       SUM(IntColumn) AS TotalIntColumn
FROM (VALUES(1,0),
            (1,2),
            (1,5),
            (1,0),
            (1,-2),
            (2,10),
            (2,-4),
            (2,-6),
            (2,0),
            (3,0))V(MyColumn,IntColumn)
GROUP BY MyColumn
HAVING SUM(IntColumn) <> 0;

请注意,在第一个数据集中返回,值为 for ,但在第二个数据集中不返回。两个结果集都不会返回值为 for as 的行,仅包含值 。20TotalIntColumn3MyColumnIntColumn0

0赞 Ross Bush 11/15/2023 #2

查询 1 将省略 soldQty <> 0 的所有记录,无论 productid 如何

查询 2 将省略与累计总和 soldQty <> 0 的所有产品关联的所有记录