SQL Запрос — Получить записи с нулевыми значениями (но убедитесь, что у них нет других записей, которые соответствуют ключу со значением)

#sql #sql-server #group-by #duplicates

#sql #sql-server #группировать по #дубликаты

Вопрос:

Итак, я пишу запрос, в соответствии с которым мне нужно получить все записи в таблице, которые имеют нулевые или «значения для двух полей…

Файл и почтовый индекс.

Моя проблема в том, что у меня есть дубликаты записей, все запросы, которые я написал до сих пор, вернут мне запись с нулевым значением или «файл и поле почтового индекса, однако один из дубликатов (на основе поля электронной почты) имеет значение файла / почтового индекса.

Мне нужно получить только те записи, где все экземпляры имеют нулевое значение файла / почтового индекса

   SELECT DISTINCT EMAIL FROM Results R
  WHERE
    ( ISNULL(R.Postcode, '') = ''
        AND
      ISNULL(R.File, '') = ''
     )
    AND NOT EXISTS (
        SELECT Id FROM Results RR
        WHERE RR.Email = R.Email
        AND (
            ISNULL(R.Postcode, '') <> ''
            AND
            ISNULL(R.File, '') <> ''
        )
    )
    ORDER BY R.Email
  

Комментарии:

1. Примеры данных и ожидаемый результат помогли бы.

Ответ №1:

Вроде слепой удар в темноте здесь, но я подозреваю, в HAVING пункте с условным совокупности будут решать этот один:

 SELECT Email
FROM Results
GROUP BY Email
HAVING COUNT(CASE WHEN Postcode IS NOT NULL AND Postcode != '' THEN 1 END) = 0
   AND COUNT(CASE WHEN [File] IS NOT NULL AND [File] != '' THEN 1 END) = 0;
  

Обратите внимание, также, что я не использовал ISNULL (или COALESCE ) в логике, но вместо этого использовал логическую логику. Это действительно важно, поскольку наличие таких функций, как ISNULL обернутый вокруг столбца в вашем WHERE запросе, делает запрос не подлежащим саржированию; это означает, что индексы в вашей таблице не могут быть использованы для помощи механизму обработки данных для фильтрации правильных строк, и вместо этого он должен выполнить полное сканирование данных.

Ответ №2:

Я бы выразил having предложение как:

 HAVING COUNT(NULLIF(Postcode, '')) = 0 AND
       COUNT(NULLIF([File], '')) = 0 ;