我希望我不会错过这里非常简单的事情。我已完成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。
答案 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)