2010-06-21 24 views
1

我有3个SQL表:JOIN和子查询的组合如何影响MySQL查询中的GROUP BY行为?

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

我想下面的查询是相同的,因为我在这里不使用集合函数和GROUP BY的行为应该以同样的方式截然不同。但是他们返回的结果集非常不同,我不明白为什么。请帮我理解这些查询之间的偏差。

查询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行。

+1

我从来没有见过像Data36,Data38,Data47这样的表名。尝试遵循命名约定。 – Pentium10 2010-06-21 13:49:35

+0

谢谢,我理解好表名的有用性。这就是为什么我给这些由遗留系统表自动生成的同义词。 – 2010-06-21 14:17:27

回答

0

当你尝试这个时会发生什么?对发现的记录还没有在第三个表coresponding记录

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) 
+0

此查询返回9210结果。但付款人表(Data36)只有5995行.. – 2010-06-21 14:22:40

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 
+0

谢谢。但是,你能解释为什么Query 1和Query 2返回不同的结果吗? – 2010-06-21 15:47:55

+0

Query1为唯一payer.Data_ID值返回1行。 Query2为payer.Data_ID和payer.type的唯一组合返回1行。 以可视方式分析查询2的结果。 – Naktibalda 2010-06-21 16:26:39

0

在查询看,似乎有只有一个功能上的差异...

查询1(153记录):

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

QUERY2(4744个记录):

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


为Query 1只Data_ID组我要说的是,你有153个Data_IDs但每个Data_ID可以有许多不同类型的值。

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


我也感到惊讶,查询1运行在所有的,因为我希望你会需要有一个聚合函数如周围的类型字段MIN/MAX。

+0

对不起,没有提到这一点:Data_ID是这些表中的主键,因此Data_ID对于这些表中的每条记录都是唯一的。 因此,Date_ID/type组合对于每一行都是相同的,因为它们来自同一个表。 – 2010-06-21 15:44:42

+0

欢迎使用MySQL,它的“功能”是允许通过设计省略GROUP BY中的列:http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html – 2010-06-21 15:58:49