2009-06-10 63 views
2

我想左连接表A至表B其中tableA的某些条件为真 所以我做这种类型的SQL查询表A LEFT JOIN(的子集)表B

Select * from 
TableA Left Join TableB on TableA.fld1 = TableB.fld2 
where TableA.fld3 = True 

的这个工程确定。 但是现在我想只对表B中的某些记录进行加入,即表B中某些条件得到满足的那些记录 ,具体为fld4具有为假为其值。我想这样做的原因是我想知道tableA中的哪些行在tableB中的行中没有匹配,其中fld4false

如果我是删除所有行TableB中,其中fld4并运行上述查询 我会得到正确的结果。我所需要做的就是找到结果记录集中的行在某个单元格中为null。 但是,如果不是从表B中删除行首先我改变查询到一个低于我得到根本没有行返回

Select * from 
TableA Left Join TableB on TableA.fld1 = TableB.fld2 
where TableA.fld3 = True 
and TableB.fld4 = false 

如果我的漫记意义可有人告诉我,我做错了吗? 谢谢

回答

5

把它联接子句中:

select * from TableA 
left join TableB 
    on TableA.fld1 = TableB.fld2 
and TableB.fld4 = False 
where TableA.fld3 = True 

编辑:啊,我错过了这一点:

我想知道哪些TableA中的行不具有TableB中fld4为false的行之间的匹配。

乔尔的查询会的工作,但因为你不感兴趣,从表B任何行,相关子查询可能会更清洁:

select * from TableA 
where TableA.fld3 = True 
    and not exists (
    select * from TableB 
    where TableA.fld1 = TableB.fld2 
     and TableB.fld4 = False 
    ) 
+0

感谢您的超级快速响应! – jjb 2009-06-10 00:59:41

+0

感谢彼得,这对我来说并不容易,但我需要尝试让我的脑子围绕子查询的概念。 – jjb 2009-06-10 01:17:42

6

你应该把条件放在join子句中。当您有一个where子句过滤左连接查询的“右侧”行时,最终会排除行。试试这个:

Select * 
from TableA 
     Left Join TableB 
     on TableA.fld1 = TableB.fld2 
     and TableB.fld4 = false 
where TableA.fld3 = True 
+0

很大,非常感谢! – jjb 2009-06-10 01:00:17

3

我想知道哪些TableA中的行不在TableB中的fld4为false的行之间有tableB中的匹配。

那么你一定要做到这一点:

SELECT * 
FROM TableA 
LEFT JOIN TableB on TableA.fld1 = TableB.fld2 AND TableB.fld4 = False 
WHERE TableA.fld3 = True 
    AND TableB.fld4 IS NULL