Поиск значений из таблицы, которые * не * входят в группу другой таблицы и в какой группе это значение отсутствует? - PullRequest
1 голос
/ 08 апреля 2010

Надеюсь, я не пропустил что-то очень простое здесь. Я сделал поиск в 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.

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

Как насчет этого:

Select ...
From RequiredDocs As RD
    Cross Join People As P
Where Not Exists(
                Select 1
                From PeoplesDocs As PD1
                Where PD1.PersonId = P.PersonId
                    And PD1.DocId = RD.DocId
                )
0 голосов
/ 08 апреля 2010
SELECT
    p.PersonID,
    rd.DocName AS MissingDocs
FROM
    dbo.People p, dbo.RequiredDocs rd
WHERE
    rd.DocID NOT IN (SELECT pd.DocID FROM dbo.PeoplesDocs pd
        WHERE pd.PersonID = p.PersonID)
...