【问题标题】:Is there an automatic way to convert Oracle's join syntax (+) to standard join syntax? [closed]是否有一种自动方法可以将 Oracle 的连接语法 (+) 转换为标准连接语法? [关闭]
【发布时间】:2020-01-12 12:52:54
【问题描述】:

从 Oracle 转换到 PostgreSQL,有很多 SQL 可以从 Oracle 的连接语法“(+)”转换为标准连接语法。有没有一种自动的方式——工具——来做到这一点?除此之外,在进行此类转换时是否有任何经验法则可供使用?

例如,转换这个:

SELECT
    request.requestId
FROM
    request,
    incident,
    changeRequest
WHERE
    incident.requestId = request.requestId AND 
    changeRequest.requestId = request.requestId(+)
/

到这里

SELECT
    request.requestId
FROM
    request
    INNER JOIN incident ON incident.requestId = request.requestId
    LEFT OUTER JOIN changeRequest ON changeRequest.requestId = request.requestId;

【问题讨论】:

  • 您似乎了解规则。我的建议是更新 Oracle 中的联接,对其进行测试,然后将代码移至 Postgres。
  • 在 SO 之外寻求资源是题外话。 (祝你好运在 Oracle 文档、出版物、博客等中找到 (+) 语义的清晰完整描述,包括手动重新添加的 12c 功能,或任何其他地方的任何人的合理猜测。如果你成功,请告诉我。)
  • 不过——这是一个常见问题。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 (例如Oracle (Old?) Joins - A tool/script for conversion?
  • 我用过的一点经验法则来计算旧的联接样式联接是/是:加号 (+) 位于您允许数据​​不足的一侧”我会发布并解释一对示例,但作为评论会很讨厌,显然您询问如何做您不完全理解的事情有时超出范围。

标签: oracle postgresql database-migration outer-join ansi-sql


【解决方案1】:

这是一个算法:

  • 如果WHERE 子句中有x.a = y.b(+),则转

    FROM x, y
    

    FROM x LEFT JOIN y ON x.a = y.b
    
  • 与左侧的 e(+)RIGHT JOIN 类似。

【讨论】:

  • 这甚至不处理问题中的示例。也不清楚它适用于哪些情况。
  • 我的印象是 Stackoverflow 的答案应该很有用。我认为情况很明显:用可怕的(+) 重写一个 Oracle 查询。
  • 我不明白那条评论是对我的回应。我只是说您只涵盖了一个特殊情况,而您对此并不清楚,而问题示例中的情况并非如此。那有 3 个表连接和一个连接在哪里。更不用说 n 个表和任意条件的一般情况了。也许您认为我的意思是它没有解决问题中的特定示例;我的意思是它甚至不适用于问题中的示例。
猜你喜欢
  • 2013-01-14
  • 2020-06-10
  • 1970-01-01
  • 2015-02-16
  • 2017-02-22
  • 2015-12-31
  • 2013-02-23
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多