我尝试按照查询来获取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,则可以正常使用
由于
答案 0 :(得分: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
时,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;