一个奇怪的 Oracle SQL,它来自 3 个表,但在 where 子句中只留下了 join 2?

Posted

技术标签:

【中文标题】一个奇怪的 Oracle SQL,它来自 3 个表,但在 where 子句中只留下了 join 2?【英文标题】:A strange Oracle SQL with from 3 tables but only left join 2 in where clause? 【发布时间】:2017-10-19 08:06:36 【问题描述】:

我经常看到“来自”2 个表和“加入”2 个表的示例。这就是为什么当我看到下面的Oracle SQL 语句时,我感到很奇怪:

select a.oid, m.acct, p.cdate
from a, p, m
where a.oid = p.oid(+) and a.uid = m.uid
    在 DBMS 中实际发生了什么? 等效的 mysql 语法是什么? JOIN 是否只是在 where 子句中表达某些条件的另一种方式? 例如a left join b on a.id=b.id 实际上只是另一种方式 表示a.id = b.id or a.id not in (select b.id from b) in where 子句

【问题讨论】:

实际上,它确实对所有 3 个表都有 JOIN 条件。第一个条件“a.oid = p.oid(+)”是ap之间的LEFT JOIN,第二个条件“a.uid = m.uid”是 am 之间的 INNER JOIN 你能分享所有 3 个表的结构和预期的输出吗? 【参考方案1】:

这相当于:

select a.oid, m.acct, p.cdate
from a left outer join p on (a.oid = p.oid)
inner join m on (a.uid = m.uid)

您发布的查询是用旧语法编写的,但与上面的 select 完全相同。有更简单的例子:

select * from a, b where a.id = b.id;

也等价于:

select * from a inner join b on (a.id = b.id);

优化器应该以相同的方式处理两个查询。连接顺序也由优化器确定。因此,回到原始示例优化器将定义是否首先应用 inner join 然后 left join 或相反。

【讨论】:

以上是关于一个奇怪的 Oracle SQL,它来自 3 个表,但在 where 子句中只留下了 join 2?的主要内容,如果未能解决你的问题,请参考以下文章

来自几个表的SQL语句

MS Access sql将5个表与列中的奇怪字符分组

2个表上的Oracle触发器:未找到任何数据

Oracle SQL - 奇怪的“ORA-00907 缺少右括号”错误

oracle sql 列别名

Oracle - PL/SQL - 使用 SELECT 作为 VALUES 插入所有