SQL-запрос найти пропущенное значение из дубликатов - PullRequest
2 голосов
/ 07 июня 2019

У меня есть такая таблица:

|__ID__|__Key__|__Value__|
|  1   |  AA   |   2     |
|  2   |  AA   |   2     |
|  2   |  BB   |   2     |
|  2   |  CC   |   2     |
|  3   |  BB   |   2     |
|  3   |  AA   |   2     |

Я пытаюсь создать запрос, который проверяет, в каких идентификаторах отсутствует ключ BB.

Так что в приведенном выше примере я получу результат

|__ID__|
|  1   |

Я пытался найти похожие вопросы здесь, в StackOVerflow и на других сайтах, но у меня всегда получается результат, в котором перечислены все строки идентификаторов, у которых нет ключа BB. В приведенном выше примере я получу 1,2,2,3.

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Вам необходимо отфильтровать ваш набор данных на основе значений, которые не в вашем наборе данных, что обычно лучше всего сделать с помощью not exists:

declare @t table (id int,keys varchar(50),value int);
insert into @t values (1,'AA',2),(2,'AA',2),(2,'BB',2),(3,'AA',2),(3,'BB',2);

select t1.id
from @t as t1
where not exists(select id
                 from @t as t2
                 where keys = 'BB'
                    and t1.id = t2.id
                );

выход

+----+
| id |
+----+
|  1 |
+----+
1 голос
/ 07 июня 2019

Вы можете сделать это многими способами.Одним из них является выбор идентификаторов с ключом BB, который легко вычитается из полного набора идентификаторов:

SELECT DISTINCT ID FROM Table1 WHERE ID NOT IN
(SELECT ID FROM Table1 WHERE [Key] = 'BB')

Вот SQLFiddle, показывающий вышеуказанное решение: http://www.sqlfiddle.com/#!18/47db9/6

Другие способы решения могут быть найдены в этом вопросе SO: SQL: Как выбрать только группы, которые не содержат определенного значения?

Чтобы найти то, что вам нужно попробовать формуВаш вопрос, например: «Как выбрать группы, которые не содержат определенного элемента», потому что в принципе вы хотите группировать элементы по идентификатору и извлекать только определенные группы, даже если мы не использовали оператор GROUP BY для его решения

1 голос
/ 07 июня 2019

Как я уже говорил в комментариях, я бы лично использовал HAVING:

SELECT ID
FROM YourTable 
GROUP BY ID
HAVING COUNT(CASE WHEN [Key] = 'BB' THEN 1 END) = 0;

DB <> fiddle для человека, который считает, что это не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...