LEFT / RIGHT JOIN中的子查询过滤器

时间:2013-07-27 12:05:01

标签: sql ms-access-2007

我尝试按照查询来获取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,则可以正常使用

由于

1 个答案:

答案 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;