为什么包含GROUP BY子句的SQL查询返回的结果数量更多?
两段SQL结果数量差异的核心原因
1. 第二段SQL存在逻辑错误:缺少表关联条件
你在第二段SQL中使用了FROM Customers, Orders的隐式连接写法,但没有添加Customers.CustomerID = Orders.CustomerID的关联条件,会直接生成笛卡尔积(交叉连接):只要Orders表存在1998年的订单,所有Customers表的联系人都会和这些订单匹配出有效行,最终返回的是所有在库的联系人姓名,而不是「1998年有下单的联系人」。你反馈的81和91的差值,刚好就是1998年没有下单的联系人数量。
2. 额外潜在逻辑差异补充
如果补全关联条件后结果仍有差异,还需要注意以下情况:
- 若存在多个不同客户的
ContactName完全重名的情况:两段SQL的DISTINCT都会对重名的联系人做合并,逻辑是一致的,不会产生差值。 - 第二段SQL中写的
DATEPART(YEAR,Orders.OrderDate)输出字段、GROUP BY Orders.OrderDate属于冗余逻辑,因为HAVING已经筛选了年份为1998,所有行的年份返回值都是1998,DISTINCT最终只对ContactName生效。
修正后的第二段SQL写法(和第一段逻辑完全等价)
SELECT DISTINCT Customers.ContactName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE DATEPART(YEAR, Orders.OrderDate) = 1998
修正后执行返回的结果数就会和第一段SQL一致,都是81条。
内容的提问来源于stack exchange,提问作者Faynn
相关产品推荐
相关产品推荐

