1

我希望我不会在这里遗漏一些非常简单的东西。我已经进行了 Google 搜索并通过 Stack Overflow 进行了搜索。

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

人民文件:

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。

4

2 回答 2

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
                )
于 2010-04-08T01:06:06.027 回答
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)
于 2010-04-08T01:06:35.063 回答