Sql 表a左联接(表B的子集)

Sql 表a左联接(表B的子集),sql,Sql,我想把TableA连接到TableB,其中TableA中的某个条件是真的 所以我做这种类型的SQL查询 Select * from TableA Left Join TableB on TableA.fld1 = TableB.fld2 where TableA.fld3 = True 这样行。 然而,现在我只想对表B中的某些记录(即那些记录)进行连接 在满足特定条件的表B中,特别是fld4的值为false。我想这样做的原因是我想知道表a中哪些行与表B中fld4为false的行不匹配 如果我要

我想把TableA连接到TableB,其中TableA中的某个条件是真的 所以我做这种类型的SQL查询

Select * from
TableA Left Join TableB on TableA.fld1 = TableB.fld2
where TableA.fld3 = True
这样行。 然而,现在我只想对表B中的某些记录(即那些记录)进行连接 在满足特定条件的表B中,特别是fld4的值为false。我想这样做的原因是我想知道表a中哪些行与表B中fld4为false的行不匹配

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

Select * from
TableA Left Join TableB on TableA.fld1 = TableB.fld2
where TableA.fld3 = True
and TableB.fld4 = false
如果我的胡言乱语有道理,有人能告诉我我做错了什么吗?
谢谢

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

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

将其放在join子句中:

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

我想知道表a中哪些行与表B中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
    )
我想知道表a中哪些行与表B中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

如果查看“unjoined”TableB,即使TableB中特定行中的fld4实际上不是空的,这是否有效?是的,这将有效,因为当SQL计算左外部联接时,它找不到匹配项,这使得结果中该行的所有TableB列都为空。@jjb:TableB.fld4为空用于根据联接条件标识TableB中找不到匹配行的TableA中的行。他可以将其写成TableB.fld2为NULL,或者使用TableB中的任何其他不可为NULL的字段。使用一个连接字段被认为是这种查询的最佳实践(只要NULL=NULL永远都不是真的)。谢谢大家,我现在理解得更好了。谢谢peter,这对我来说并不容易,但我需要尝试了解子查询的概念。接受这一点,因为这解决了我的问题,不幸的是,另一个构造对我的access数据库不起作用。第一个查询帮助了我。这正是我需要的。