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

时间:2010-06-21 13:46:41

标签: 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行。

3 个答案:

答案 0 :(得分:0)

尝试此操作会发生什么?

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) 

答案 1 :(得分:0)

找到第三个表中没有相应记录的记录的正确且最有效的方法是:

SELECT payer.Data_ID, payer.type
FROM Data36 AS payer
JOIN Data38 AS serv ON payer.Data_ID = serv.clientId
LEFT JOIN Data47 AS regsites  ON(regsites.payerID = payer.Data_ID)
WHERE regsites.payerID IS NULL
GROUP BY payer.Data_ID

答案 2 :(得分:0)

查看您的查询似乎只有一个功能差异......

查询1(153条记录):

SELECT payer.Data_ID, payer.type FROM <blah> GROUP BY payer.Data_ID

查询2(4744条记录):

SELECT DISTINCT payer.Data_ID, payer.type FROM <blah>


由于Query1仅按Data_ID分组,我会说你有153个Data_ID但每个Data_ID可以有许多不同的类型值。

Query2返回每个不同的Data_ID /类型组合,但Query1仅为每个Data_ID返回1条记录。


我也很惊讶Query1完全运行,因为我预计你需要在类型字段周围有一个聚合函数,如MIN / MAX。