仅当NOT NULL时才加入列

时间:2015-08-03 07:46:32

标签: sql oracle join null

我正在重新编写一个旧的SQL查询,并且有麻烦从中理解。它包含几种形式的条件

SELECT ...
FROM a, b, c
WHERE
c.id = ...
AND (
  a.x_id IS NULL
  OR a.x_id = c.x_id
)
AND b.id = a.b_id (+)

可以使用正确的JOIN语法重写此查询吗?它是否等同于以下内容,还是会在某些情况下产生不同的结果?

SELECT ...
FROM b
LEFT JOIN a
ON b.id = a.b_id
LEFT JOIN c
ON a.x_id = c.x_id
WHERE c.id = ...

原始查询长度为100行,跨越5个表,加上“虚拟表”的多个连接(即形式x.z_id = y.z_id的条件),这使得很难分解为更易于管理的位或调试

1 个答案:

答案 0 :(得分:1)

如果您想要在第一次查询中获得相同的结果 - 您必须仅使用表a进行左连接,如下所示:

SELECT ...
FROM  b, c
LEFT JOIN a
ON b.id = a.b_id and b.id = a.b_id
WHERE
c.id = ... b.c_id  

或者如果你想要与所有表格相同的样式,你可以使用表格b的内部联接,如下所示:

SELECT ...
FROM  c
INNER JOIN b
on b.c_id = c.id
LEFT JOIN a
ON b.id = a.b_id 
WHERE
c.id = ... 

在我的两个查询中,我们从表b中选择列不为空的数据