查找表中的值*不是*在另一个表的分组中以及缺少哪个值的组?

时间:2010-04-08 01:00:47

标签: sql-server-2008 missing-data

我希望我不会错过这里非常简单的事情。我已完成Google搜索并通过Stack Overflow搜索。

以下是这种情况:为了简单起见,我假设我在SQL Server 2008数据库中有一个名为“PeoplesDocs”的表,它包含一群人和他们拥有的所有文档。所以一个人可以有几个文件。我还有一个名为“RequiredDocs”的表,它只包含一个人应该拥有的所有文档。这是它的样子:

PeoplesDocs:

PersonID   DocID  
--------   -----  
1          A  
1          B  
1          C  
1          D  
2          C  
2          D  
3          A  
3          B  
3          C  

RequiredDocs:

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 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

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
                )

答案 1 :(得分:0)

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)