SQL Как вы находите отсутствующие идентификаторы (не в последовательности или без последовательности)?

#sql #sql-server

#sql #sql-server

Вопрос:

У меня есть данные в таблице, которая выглядит как на картинке ниже. С каждым идентификатором DocID связано несколько идентификаторов ItemId. Я пытаюсь найти, у каких идентификаторов документов нет идентификатора элемента ‘14000’, например (в правом нижнем углу рисунка.)

Как я могу получить список всех идентификаторов DocID, с которыми не связан ItemId ‘14000’, пожалуйста?

введите описание изображения здесь

Вот одна из версий того, что я пробовал до сих пор.

 SELECT      
d.DocID
FROM            tableD AS d
WHERE           d.GID = 19
            AND d.TID = 159
            AND 1283 NOT IN (SELECT d.ItemID FROM tableD)
GROUP BY    d.DocID
 

Вот временная таблица на случай, если это полезно.

 CREATE TABLE #t1 (
DocID   int
,GID    int
,TID    int
,ItemID     int
,Keyword VARCHAR(40)
)

INSERT INTO #t1 
VALUES 
(321654,    28, 1789,   13841,  'Jim'),
(321654,    28, 1789,   13851,  'Smith'),
(321654,    28, 1789,   13861,  'William'),
(321654,    28, 1789,   13871,  '000-00-0000'),
(321654,    28, 1789,   13881,  'SALARY'),
(978312,    28, 1789,   13841,  'Jim'),
(978312,    28, 1789,   13851,  'Smith'),
(978312,    28, 1789,   13861,  'William'),
(978312,    28, 1789,   13871,  '000-00-0000'),
(978312,    28, 1789,   13881,  'SALARY')
 

Спасибо за вашу помощь.

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

1. Пожалуйста, не используйте изображения для данных, используйте форматированный текст.

2. Вы усложнили , а не упростили задачу. Изображения нельзя копировать, запрашивать, компилировать или выполнять

3. @PanagiotisKanavos, я понимаю вашу точку зрения, я добавил временную таблицу на случай, если это будет полезно. Спасибо за отзыв.

Ответ №1:

Использование HAVING :

 SELECT d.DocID   
FROM tableD AS d
WHERE  d.GID = 19 AND d.TID = 159
GROUP BY d.DocID
HAVING COUNT(CASE WHEN itemid = '14000' THEN 1 END) = 0
 

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

1. Спасибо за вашу помощь! Для других, и это помогает мне научиться пытаться объяснить это, благодаря объяснению Гордона, предложение HAVING присваивает 1 любому идентификатору docid, который имеет ItemId 14000, и 0 любому идентификатору docid, который этого не делает. Затем он дополнительно фильтрует список, чтобы показывать только те, у которых есть 0, что означает любой docid, с которым не связано 14000.

Ответ №2:

Я пытаюсь найти, у каких идентификаторов документов нет идентификатора элемента ‘14000’, например (в правом нижнем углу рисунка.)

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

 select docid
from tableD
group by docid
having sum(case when itemId = 14000 then 1 else 0 end) = 0;
 

Этот код подсчитывает количество элементов, которые вас интересуют. В предложении having говорится, что ни один из этих элементов не связан с данным docid .

Я не уверен, какое отношение ваш код имеет к заданному вами вопросу.

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

1. Спасибо @Gordon Linoff!! Я сохранил предложение where для своего кода.

2. Не могли бы вы точно объяснить, что делает ваше предложение having?

3. Спасибо за вашу помощь и ваше объяснение! Мой желаемый результат требовал использования кода с предложением where .

4. @JM1 . , , Вы, конечно, можете сохранить любую фильтрацию, которую вы хотите, в WHERE предложении. Эта фильтрация не является частью заданного вами вопроса.