TableAU左连接(表的子集)表B.

时间:2009-06-10 00:52:17

标签: sql

我想将TableA连接到TableB,其中tableA中的某个条件为true 所以我做这种类型的SQL查询

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

这很好用。 然而,现在我想只使用TableB中的某些记录进行Join,即那些记录 在表B中满足某个条件,特别是 fld4 具有 false 作为其值。我想这样做的原因是我想知道tableA中哪些行在tableB中的行中没有匹配,其中 fld4 false

如果我要删除TableB中 fld4 true 的所有行并运行上述查询 我会得到正确的结果。我需要做的就是在某些单元格中找到结果记录集中的行。 但是,如果不是从TableB中删除行,而是首先将查询更改为下面的一行,我得到的所有行都没有返回

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

如果我的ramblings有意义,有人可以告诉我我做错了什么吗? 感谢

3 个答案:

答案 0 :(得分:8)

您应该将条件放在join子句中。如果有一个where子句可以过滤左连接查询“右侧”的行,则最终会排除行。试试这个:

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

答案 1 :(得分:6)

将它放在join子句中:

select * from TableA 
left join TableB 
  on TableA.fld1 = TableB.fld2 
 and TableB.fld4 = False
where TableA.fld3 = True
编辑:啊,我错过了这个:

  

我想知道tableA中哪些行在tableB中的行中没有匹配,其中fld4为false。

Joel的查询可行,但由于您对TableB中的任何行不感兴趣,因此相关子查询可能更清晰:

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

答案 2 :(得分:4)

  

我想知道tableA中哪些行在tableB中的行中没有匹配,其中fld4为false。

然后你想这样做:

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