1

ここで非常に単純なものを見逃していないことを願っています。Googleで検索し、StackOverflowで検索しました。

状況は次のとおりです。簡単にするために、SQL Server 2008 DBに「PeoplesDocs」というテーブルがあり、多数のユーザーとそのユーザーが所有するすべてのドキュメントを保持しているとします。したがって、1人の人が複数のドキュメントを持つことができます。また、「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)  

ただし、この例では、全員が少なくとも1つのドキュメントを持っているため、明らかにこれは何も返しません。

また、人がドキュメントを持っていない場合、DocIDがNULLに設定されたPeoplesDocsテーブルに1つのレコードがあります。

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 に答える