Как и почему комбинация JOIN и подзапроса влияет на поведение GROUP BY в запросе MySQL? - PullRequest
1 голос
/ 21 июня 2010

У меня есть 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 голосов
/ 21 июня 2010

Правильный и самый эффективный способ найти записи, которые не содержат записей в третьей таблице:

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 голосов
/ 21 июня 2010

Глядя на ваш запрос, можно заметить только одно функциональное отличие ...

Запрос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 / type, но Query1 возвращает только 1 запись для каждого Data_ID.


Я также удивлен, что Query1 работает вообще, так как я ожидаю, что вам потребуется Обязательная функция, такая как MIN / MAX, вокруг поля типа.

0 голосов
/ 21 июня 2010

Что происходит, когда вы пытаетесь это сделать?

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) 
...