0

TAB1で欠落しているレコードを取得するために、次のクエリを試しました

SELECT *
FROM TAB1 T1 
RIGHT JOIN TAB2 T2 ON T1.MemNo = T2.MemID
WHERE EXISTS ( SELECT 1
               FROM TAB3 x 
               WHERE x.Col2 =  T2.SVID
               AND x.Col1 = T1.SID )
AND T1.MemNo IS NULL

でも結果が出ない

サンプルデータ;

TAB1

MemNo   SID

116537  S110
116537  D011
575777  D012
214438  S110
434611  D114
214438  D011
208368  D012
208368  S110

TAB2

MemID   SVID

116537  110
116537  11
214438  11
434675  114
214438  110
575788  12
208368  12
208368  110


TAB3

Col1    Col2

D011    11
S110    110
D114    114
D012    12

期待される結果を得るには、クエリをどのように変更すればよいですか。以下のように言及されています

TAB2

MemID   SVID

575788  12
434675  114

INNER JOINの場合、これは正常に機能します

ありがとう

4

1 に答える 1

1

これがあなたの質問です。私はそれをよりよく理解できるように書いています:

select *
from tab2 t2 left outer join
     tab1 t1
     on t1.MemNo = t2.MemId
where exists (SELECT 1
              FROM TAB3 x 
              WHERE x.Col2 =  T2.SVID AND x.Col1 = T1.SID ) and
      T1.MemNo IS NULL

t1.MemNo外部結合がそのテーブルで一致を見つけられなかった場合にのみ、列は NULL になります (結合条件の一部であるため)。これが である場合NULL、条件の 1 つが と評価されるT1.SIDため、exists句は行を検出しません。ANDNULL

existsこのケースを処理する場合は、句にもロジックが必要です。

select *
from tab2 t2 left outer join
     tab1 t1
     on t1.MemNo = t2.MemId
where exists (SELECT 1
              FROM TAB3 x 
              WHERE x.Col2 =  T2.SVID AND (x.Col1 = T1.SID or t1.SID is null)) and
      T1.MemNo IS NULL;
于 2013-07-27T12:16:41.913 に答える