【问题标题】:Oracle using (+) for left outer joinOracle 使用 (+) 进行左外连接
【发布时间】:2018-03-06 17:34:24
【问题描述】:

我有这个使用外部左自连接的查询,它显示了我的期望:

SELECT c.date, u.user_id from order_detail_trans c
LEFT OUTER JOIN order_detail_trans u
ON u.trans_id = c.trans_id
AND u.trans_type = 'UPDATE DETAIL'

我正在将一个表加入到自身中,因为我希望我的一个列 (user_id) 仅填充那些 trans_type 为“UPDATE DETAIL”的行...但仍需要显示此表中的行反式。上面的查询似乎可以解决问题。我得到了带有 trans_types 的记录,以及带有 'UPDATE DETAIL' 作为 trans_type 显示 user_id 的记录

我需要它来使用 Oracle (+) 语法,这是我从这个源中得到的——https://chartio.com/resources/tutorials/left-and-right-joins-using-the-plus-sign-in-oracle/#performing-outer-joins-using-the-symbol:

SELECT c.date, u.user_id from order_detail_trans c, order_detail_trans u
WHERE u.trans_id(+) = c.trans_id
AND u.trans_type = 'UPDATE DETAIL'

但这不会显示 trans_type 不是“UPDATE DETAIL”的行

用 (+) 语法重写第一个查询以呈现相同结果的正确方法是什么?

【问题讨论】:

  • 甚至 Oracle 都建议停止使用 (+) 运算符并使用显式 LEFT JOIN
  • 只使用LEFT JOIN 有什么问题?如果它适用于LEFT JOIN,为什么要使用+ 方法?不推荐。
  • 为什么每个 Oracle 开发人员似乎都认为使用 25 年前的语法可以改进他们的查询?即使提出相反的经验证据。我想这是个反问,但如果你们喜欢聚在一起并与 SQL 世界的其他人保持一致,那就太棒了。当我们在 2018 年有了混凝土、木材和塑料时,这就像试图用泥和木棍建造房子一样。
  • @JacobH:我被“每个 Oracle 开发人员”冒犯了 ;) - 在 Oracle 在他们的手册中包含该建议之前,我一直主张停止使用 (+)。
  • 嘿,所有这些对 (+) 语法的抨击是怎么回事?甲骨文这样说,甲骨文建议这样做。您是否曾经看过外连接查询的解释计划,看到 Oracle 即使在今天 将 ANSI 语法重写为其专有 (+) 表示法?此外,您是否知道某些 Oracle 功能不适用于 ANSI 语法(即使对于内部 查询,更不用说外部查询),它们仅适用 使用 Oracle 旧式语法?其中一种情况是加入物化视图并在提交时刷新。显然应该首选 ANSI 语法,但仍然......请适度!

标签: sql oracle left-join


【解决方案1】:

需要在带有字面量的条件中包含(+) 运算符

较旧的外连接方法要求您在文字上包含 (+) 运算符作为条件。

只要戴上“复古”精神帽,回到 90 年代。 :)

这是使用这种方法的外观:

SELECT
    c
.DATE,
 u.user_id
FROM
    order_detail_trans c,
    order_detail_trans u
WHERE
    u.trans_id (+) = c.trans_id
    AND   u.trans_type (+) = 'UPDATE DETAIL'

以下是表格示例,emp 和 dept:

SCOTT@db>SELECT
  2      d.deptno,
  3      e.job
  4  FROM
  5      dept d
  6      LEFT OUTER JOIN emp e ON d.deptno = e.deptno
  7      and e.job = 'CLERK'
  8  GROUP BY
  9      d.deptno,
 10      e.job
 11  ORDER BY
 12      1,
 13      2;
  DEPTNO JOB     
      10 CLERK   
      20 CLERK   
      30 CLERK   
      40         


SCOTT@db>SELECT
  2      d.deptno,
  3      e.job
  4  FROM
  5      dept d,
  6      emp e
  7  WHERE
  8      d.deptno = e.deptno (+)
  9   AND e.job (+) = 'CLERK'
 10  GROUP BY
 11      d.deptno,
 12      e.job;
  DEPTNO JOB     
      20 CLERK   
      30 CLERK   
      10 CLERK   
      40    

信不信由你,我相信大多数 Oracle 应用程序商店只是使用这种较旧的外部联接方法。

【讨论】:

  • 它需要的是,如果您将 (+) 与表/别名中的列一起使用,那么您将其与该表/别名中的每一列一起使用。正如文档中明确说明的那样。
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多