我正在重新编写一个旧的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
的条件),这使得很难分解为更易于管理的位或调试
答案 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中选择列不为空的数据