У меня есть несколько столов с людьми, и мне нужно перечислить всех лиц, которые более одного документа и имеют определенный тип документа.

Таким образом, люди, которые:

  1. иметь более одного DocumentType и
  2. иметь один документ с DocumentType = 10.

Я получаю названия и документы, как это:

SELECT Name, DocumentType FROM 
(
    SELECT Name, DocumentType FROM SomeTable
      UNION
    SELECT Name, DocumentType FROM SomeOtherTable
      UNION
    SELECT Name, DocumentType FROM YetAnotherTable
) 
GROUP BY Name
HAVING COUNT(Name) > 1

И это возвращает имена, которые имеют более одного документа.

Но как я могу проверить, есть ли одна из документов DocumentType = 10?

0
Lou 7 Июн 2021 в 16:36

2 ответа

Лучший ответ

Вы можете просто использовать условную агрегацию COUNT

SELECT Name, DocumentType
FROM 
(
    SELECT Name, DocumentType FROM SomeTable
      UNION ALL
    SELECT Name, DocumentType FROM SomeOtherTable
      UNION ALL
    SELECT Name, DocumentType FROM YetAnotherTable
) t
GROUP BY Name
HAVING COUNT(*) > 1
  AND COUNT(CASE WHEN DocumentType = 10 THEN 1 END) = 1  -- or maybe >= 1

Примечания:

  • UNION ALL более эффективен, так как он не удаляет дубликаты. Как вы группируете Name в любом случае, это не имеет значения
  • Вам нужен псевдоним на полученном столе
  • COUNT(Name) считает только Name, который не нулевой, неясно, почему вы хотите этого, а не COUNT(*)
2
Charlieface 7 Июн 2021 в 13:42

Я подозреваю, что вы хотите, - это условный совокупность. Также я подозреваю, что вы хотите, чтобы UNION ALL не UNION, как и в противном случае, как человек с 2 или более из Time Time , но только документы этого Тип не будет возвращен:

SELECT Name,
       DocumentType
FROM (SELECT Name,
             DocumentType
      FROM SomeTable
      UNION ALL
      SELECT Name,
             DocumentType
      FROM SomeOtherTable
      UNION ALL
      SELECT Name,
             DocumentType
      FROM YetAnotherTable) sq
GROUP BY Name
HAVING COUNT(Name) > 1
   AND COUNT(CASE DocumentType WHEN 10 THEN 1 END) >= 1;

2
Larnu 7 Июн 2021 в 13:41