【发布时间】: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 语法,但仍然......请适度!