Подсчет (отличный) не работает для нескольких внутренних соединений в SQL Server 2016 - PullRequest
0 голосов
/ 07 мая 2018

У меня запрос ниже с count(distinct u.uid), и когда я запускаю запрос ниже, он переходит в состояние выполнения, если я запускаю count(1), то я получаю результат 236. Я не понимаю, почему count(distinct u.uid) не возвращаетрезультат.

Обратите внимание, что этот запрос выполняется в другой среде SQL Server, но не уверен, почему он не работает в SQL Server 2016 (я не уверен, относится ли он к среде 2016)

SELECT 
    COUNT(distinct u.uid) AS NOOFROWS 
FROM 
    ABC u
INNER JOIN 
    (SELECT uemail 
     FROM ABC 
     GROUP BY uemail 
     HAVING COUNT(1) = 1) AS u2 ON u.uemail = u2.uemail 
INNER JOIN 
    PQR on u.uid = PQR.uid  
INNER JOIN 
    XYZ p ON u.uid = p.uid 

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Проверьте ниже внутреннего запроса, возвращает ли он строки или нет?

SELECT uemail
FROM ABC
GROUP BY uemail
HAVING COUNT(1) = 1
0 голосов
/ 07 мая 2018

Я переписываю запрос, чтобы лучше его прочитать:

SELECT COUNT(distinct u.uid) AS NOOFROWS 
FROM ABC u INNER JOIN
     (SELECT uemail
      FROM ABC
      GROUP BY uemail
      HAVING COUNT(1) = 1
     ) u2
     ON u.uemail = u2.uemail INNER JOIN
     PQR 
     ON u.uid = PQR.uid INNER JOIN
     XYZ p
     ON u.uid = p.uid ;

Я интерпретировал вопрос как запрос, дающий 0, но это невозможно, что COUNT(1) возвращает 236, а COUNT(DISTINCT u.uid) возвращает 0 (если в SQL Server нет ошибки). COUNT(DISTINCT) возвращает 0, только если все значения u.uid равны NULL. Поскольку u.uid используется в INNER JOIN, он никогда не может быть NULL. Вы могли бы получить 1, если бы все 236 строк имели одинаковое значение, но вы не можете получить 0.

Итак, возможно, вы имеете в виду, что запрос не возвращается. Если это так, то вы можете использовать explain, чтобы увидеть, почему два плана выполнения отличаются.

...