如何用 Oracle 的符号 (+) 重写查询
Posted
技术标签:
【中文标题】如何用 Oracle 的符号 (+) 重写查询【英文标题】:How can I rewrite the query in the notation (+) from Oracle 【发布时间】:2021-03-31 23:21:15 【问题描述】:,即没有连接会发生什么?
select *
from tbl1
left join (
tbl2 join tbl3
on tbl3.id = tbl2.a
and tbl3.b = 50
)
on tbl1.id = tbl2.c
【问题讨论】:
为什么要将现代 ANSI 语法转换为 30 年前被取代的遗留专有语法? Оld 隔离系统仍然存在 @TulaMan71,Oracle已经支持ANSI SQLLEFT JOIN
语法since version 9i,发布于2001年6月。你是说你还在使用20多年前的Oracle版本?跨度>
【参考方案1】:
我想你想要:
WITH t23 AS (
SELECT *
FROM tbl2,
tbl3
WHERE tbl3.id = tbl2.a
AND tbl3.b = 50
)
SELECT *
FROM tbl1,
t23
WHERE tbl1.id = t23.c (+)
或:
SELECT *
FROM tbl1,
(
SELECT *
FROM tbl2,
tbl3
WHERE tbl3.id = tbl2.a
AND tbl3.b = 50
) t23
WHERE tbl1.id = t23.c (+)
但是,请坚持使用现代 ANSI 语法,不要使用 30 年前被取代的令人困惑的遗留逗号连接。
【讨论】:
在 Lorax 著名的最后一句话中,“除非”。 Oracle 中的一些特性仍然需要旧的连接语法(最值得注意的是,提交时刷新的物化视图);还有更多的情况,Oracle 将 ANSI 语法内部转换为旧的 Oracle 语法(这是 Oracle 实现 ANSI 语法的方式)是错误的。使用 ANSI 语法的相同查询会引发错误(当查询实际上完全正常时);用 Oracle 语法重写后,它确实工作得很好。所以,我同意 - 坚持使用 ANSI 语法,除非...以上是关于如何用 Oracle 的符号 (+) 重写查询的主要内容,如果未能解决你的问题,请参考以下文章