【问题标题】:How can I rewrite the query in the notation (+) from Oracle如何用 Oracle 的符号 (+) 重写查询
【发布时间】:2021-03-31 23:21:15
【问题描述】:

如何用 Oracle 的符号 (+) 重写查询,即没有连接会发生什么?

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版本?跨度>

标签: sql oracle join


【解决方案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 语法,除非...
猜你喜欢
  • 2013-12-14
  • 2015-10-29
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多