2010-06-21 67 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