簡體   English   中英

LEFT / RIGHT JOIN中的子查詢過濾器

[英]Sub query filter in LEFT/RIGHT JOIN

我嘗試了以下查詢以獲取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的情況下可以正常工作

謝謝

這是您寫的查詢,以便我更好地理解:

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未能在該表中找到匹配項時(因為它是t1.MemNo條件的一部分),列t1.MemNo為NULL。 當這是NULL那么這樣是T1.SID ,所以exists子句將找不到行因為一個AND條件計算為NULL

如果要處理這種情況,那么還需要在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM