我在两个定义为左外连接的表上有一个连接,这样所有记录都从左手表中返回,即使它们在右表中没有记录也是如此。但是我还需要在右侧表格的字段中包含一个where子句,但是......我仍然想要为左侧表格中的每个记录返回左侧表格中的一行,即使不满足where子句中的条件。有没有办法做到这一点?
答案 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
(这对于外连接是常见的)。您可以将ifnull
或coalesce
用于其他数据库。
因此,如果符合联接谓词,则将t2.some_field
与搜索条件进行比较,但如果没有,则只需从table1
返回行,因为some_required_value
与自身相比较将永远为真(除非它是null
,但是 - null = null
会产生null
,true
不会false
。