一个奇怪的 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(+)”是a和p之间的LEFT JOIN,第二个条件“a.uid = m.uid”是 a 和 m 之间的 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?的主要内容,如果未能解决你的问题,请参考以下文章