如何用 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 的符号 (+) 重写查询的主要内容,如果未能解决你的问题,请参考以下文章

如何用 LINQ 重写笛卡尔积

如何用我的案例重写URL

使用路径前缀规则时如何用 Traefik 重写路径?

如何用 Google Big Query Table 中的另一个分区重写一个分区?

重写 Oracle SQL 查询

如何为 OLAP 多维数据集部署 Oracle 维度表