#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
предложении. Эта фильтрация не является частью заданного вами вопроса.