2017-04-05 2 views
1

ユーザーが割り当てた文書を取得するクエリがあります。 いくつかの文書が欠落しているユーザーがあります これらの文書を完成させる必要があるアプリケーションには、どの文書が存在しないのかを検索したいと考えています。 以下は私の質問です 私はどこに存在しない部分に立ち往生しています。このクエリはすべてのレコードを返さないと私は、これらのユーザーの一部がWHEREあなたは内部結合に参加左折され、この文書ユーザー文書に含まれていないレコードを検索するためにwhereを使用しない場合

SELECT T.PRAC_ID, T.Document_ID, T.DocumentName, S.DOC_ID FROM 
    **#TMP_PRCS T-- this is the table that contains the doucments the users have** LEFT OUTER JOIN 
    **#tmp_doclookup S -- this is the doc look up table that contains userid and doc id.** ON T.PRAC_ID = S.PRAC_ID WHERE NOT EXISTS 
    (SELECT DOC_ID FROM #TMP_PRCS L WHERE S.PRAC_ID = L.prac_id) ORDER 
    BY PRAC_ID, DOCUMENT_ID 
+0

https://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ –

答えて

0

を持っていない知っています。代わりにその条件を結合のON節に追加します。

select T.PRAC_ID, 
    T.Document_ID, 
    T.DocumentName, 
    S.DOC_ID 
from #TMP_PRCS T 
left outer join #tmp_doclookup S on T.PRAC_ID = S.PRAC_ID 
    and not exists ( -- Use "and" here instead of "where" 
     select DOC_ID 
     from #TMP_PRCS L 
     where S.PRAC_ID = L.prac_id 
     ) 
order by PRAC_ID, 
    DOCUMENT_ID 
0

利用可能なすべてのドキュメント(S)を選択し、ユーザーが既に持っているドキュメント(T)に残す必要があります。ユーザーがドキュメントを持っていない場合、Tのすべてのフィールドはnullになります。

SELECT T.PRAC_ID, T.Document_ID, T.DocumentName, S.DOC_ID FROM 
#tmp_doclookup S -- this is the doc look up table that contains userid and doc id. 
LEFT JOIN #TMP_PRCS T -- this is the table that contains the doucments the users have 
ON T.PRAC_ID = S.PRAC_ID WHERE T.PRAC_ID IS NULL 
関連する問題