Надеюсь, я не пропустил что-то очень простое здесь. Я сделал поиск в Google и искал через переполнение стека.
Вот ситуация: для простоты, скажем, у меня есть таблица «PeoplesDocs» в БД SQL Server 2008, в которой содержится группа людей и все документы, которыми они владеют. Таким образом, один человек может иметь несколько документов. У меня также есть таблица «RequiredDocs», в которой просто хранятся все документы, которые должен иметь человек. Вот как это выглядит:
PeoplesDocs:
PersonID DocID
-------- -----
1 A
1 B
1 C
1 D
2 C
2 D
3 A
3 B
3 C
Обязательные документы:
DocID DocName
----- ---------
A DocumentA
B DocumentB
C DocumentC
D DocumentD
Как мне написать SQL-запрос, который возвращает некоторые варианты:
PersonID MissingDocs
-------- -----------
2 DocumentA
2 DocumentB
3 DocumentD
Я пытался, и большинство моих поисков указывало на что-то вроде:
SELECT DocID
FROM DocsRequired
WHERE NOT EXIST IN (
SELECT DocID FROM PeoplesDocs)
но очевидно, что в этом примере это ничего не вернет, поскольку у каждого есть хотя бы один из документов.
Кроме того, если у человека нет документов, тогда в таблице PeoplesDocs будет одна запись с DocID, установленным в NULL.