sql - JOIN 和子查询的组合如何以及为什么影响 MySQL 查询中的 GROUP BY 行为?

标签 sql mysql group-by aggregate-functions

我有 3 个 sql 表:

Data36 (Data_ID:int <PK>, type:int), 
Data38(Data_ID:int <PK>, clientId:int), 
Data47(Data_ID:int <PK>, payerID:int).

我认为以下查询是相同的,因为我在这里没有使用聚合函数,GROUP BY 的行为方式应该与 DISTINCT 相同。但是他们返回的结果集非常不同,我不明白为什么。请帮助我理解这些查询之间的区别。

查询 1(返回 153 行):

SELECT payer.Data_ID, payer.type
 FROM Data36 AS payer
 JOIN Data38 AS serv ON payer.Data_ID = serv.clientId
 WHERE ((SELECT count(*) FROM Data47 AS regsites WHERE regsites.payerID = payer.Data_ID) = 0)
 GROUP BY payer.Data_ID, payer.type

查询 2(返回 4744 行):

SELECT DISTINCT payer.Data_ID, payer.type
 FROM Data36 AS payer
 JOIN Data38 AS serv ON payer.Data_ID = serv.clientId
 WHERE ((SELECT count(*) FROM Data47 AS regsites WHERE regsites.payerID = payer.Data_ID) = 0)

SQL Server 版本为 5.0.40。

如果您需要更具体的信息,请告诉我。

更新:抱歉没有提及:Data_ID 是这些表中的主键,因此 Data_ID 对于这些表中的每条记录都是唯一的。

SELECT count( *  ) FROM Data36 
--returns 5998
SELECT count(DISTINCT Data_ID) FROM Data36 
--returns 5998

更新 2: 在查询 1 中,我将“GROUP BY payer.Data_ID”更改为“GROUP BY payer.Data_ID, payer.type”。结果仍然相同 - 153 行。

最佳答案

当你尝试这个时会发生什么?

select payer.Data_ID, payer.type from
(
SELECT DISTINCT Data_ID, type 
 FROM Data36
) AS payer 
 JOIN Data38 AS serv ON payer.Data_ID = serv.clientId 
 WHERE ((SELECT count(*) FROM Data47 AS regsites WHERE regsites.payerID = payer.Data_ID) = 0) 

关于sql - JOIN 和子查询的组合如何以及为什么影响 MySQL 查询中的 GROUP BY 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3085168/

相关文章:

使用左连接的 MySQL 非常慢的查询

mysql - 多态关联替代

mysql - 将大型 XML 文件转换为 MySQL 的最简单方法

mysql - 表中绝对没有数据时违反主键

mysql - Atomikos:事务包含多个持久化时的异常

MySQL除以2个子查询的值

mysql - 我应该在我的表上创建索引吗?

mysql - 通过 SQL 查询重新配置行中的表列数据

php - Android 与 MySQL 数据库的基本交互

mysql - 在 MYSQL 中合并 2 个表并删除重复项的最佳方法是什么?