sql - 仅当 NOT NULL 时加入列

标签 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 形式的 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/

相关文章:

sql - 当 TRIGGER 需要在同一个表中选择和插入行时发生变异表问题

mysql - MySQL 中的完全外连接而不重复值

MySQL 连接帖子、用户信息和评级的三个表

sql - 如何从 Presto/AWS Athena 的数据行中删除换行符?

sql - 如何在 JPA 命名查询的 IN 子句中使用动态参数?

sql - 使用 TOAD 从另一个表插入的 ORACLE 未正确对齐(显示 NULL)

eclipse - 如何解决 Oracle weblogic 服务器中的 SplitsrcTargetPreparation 异常?

sql - 使用 SQL 组织日期/时间表 - Postgres

oracle - 使用没有钱包的 sqlplus 连接到 Oracle 自治数据库

mysql - 基于列值的分组、计数和排除