我正在重写一个旧的 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
形式的 where 条件),这使得它很难分解成更易于管理的位或调试。
最佳答案
如果您想要与第一个查询中的结果相同 - 您必须只对表 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 中选择数据
关于sql - 仅当 NOT NULL 时加入列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31781976/