左外连接和另外的where子句

时间:2010-09-09 13:57:49

标签: sql join

我在两个定义为左外连接的表上有一个连接,这样所有记录都从左手表中返回,即使它们在右表中没有记录也是如此。但是我还需要在右侧表格的字段中包含一个where子句,但是......我仍然想要为左侧表格中的每个记录返回左侧表格中的一行,即使不满足where子句中的条件。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:20)

是的,将条件(称为谓词)放在连接条件

   Select [stuff]
   From TableA a
       Left Join TableB b
           On b.Pk = a.Pk
               -- [Put your condition here, like this]
               And b.Column = somevalue

答案 1 :(得分:10)

您只需将谓词置于JOIN条件中即可。将它放入WHERE子句可以有效地将查询转换为内连接。

例如:

...
From a
Left Join b on a.id = b.id and b.condition = 'x'

答案 2 :(得分:2)

您可以使用

WHERE (right_table.column=value OR right_table.column IS NULL)

这将返回表1和表2中的所有行,但仅限于表1在表2中没有对应的行或表2中的相应行符合您的条件。

答案 3 :(得分:1)

SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc

答案 4 :(得分:0)

select * 
  from table1 t1 
  left outer join table2 t2 on t1.id = t2.id
 where t1.some_field = nvl(t2.some_field, t1.some_field) 

UPD:错误...没有。这样:

select * 
  from table1 t1 
  left outer join table2 t2 on t1.id = t2.id
 where some_required_value = nvl(t2.some_field, some_required_value) 

nvl是一种Oracle语法,它将第一个参数替换为第二个参数,如果它是null(这对于外连接是常见的)。您可以将ifnullcoalesce用于其他数据库。

因此,如果符合联接谓词,则将t2.some_field与搜索条件进行比较,但如果没有,则只需从table1返回行,因为some_required_value与自身相比较将永远为真(除非它是null,但是 - null = null会产生nulltrue不会false