Oracle(旧?)加入 - 用于转换的工具/脚本?

时间:2010-03-11 14:58:12

标签: sql database oracle plsql outer-join

我一直在移植oracle选择,我一直在运行大量的查询:

SELECT e.last_name,
       d.department_name
  FROM employees e,
      departments d
WHERE e.department_id(+) = d.department_id;

...和

SELECT last_name, 
       d.department_id
  FROM employees e, 
       departments d
 WHERE e.department_id = d.department_id(+);

是否有任何指南/教程可用于转换(+)语法的所有变体?什么是语法甚至调用(所以我可以搜索谷歌)?

更好 ..是否有工具/脚本可以为我执行此转换(首选免费)?某种优化器?我有大约500个这样的查询来移植..

此标准何时淘汰?任何信息都表示赞赏。

6 个答案:

答案 0 :(得分:22)

(+)是Oracle特定的ANSI-92 OUTER JOIN前语法,因为ANSI-89语法不提供OUTER JOIN支持的语法。

RIGHT还是LEFT取决于哪个表格和&附加符号的列引用。如果在与FROM子句中的第一个表关联的列旁边指定它,则它是RIGHT个连接。否则,它是LEFT加入。 This a good reference for anyone needing to know the difference between JOINs

使用ANSI-92语法重写的第一个查询:

    SELECT e.lastname,
           d.department_name
      FROM EMPLOYEES e
RIGHT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid

使用ANSI-92语法重写第二个查询:

   SELECT e.lastname,
          d.department_name
     FROM EMPLOYEES e
LEFT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid

答案 1 :(得分:3)

Google“Oracle加入语法”。 (+)用于不同类型的外连接。我认为你展示的第一个是左外连接,第二个是右外连接。我已经有很长一段时间没有看到这种表示法,所以我可能会有点休息,但希望这能为你提供足够的信息来打击谷歌并得到正确答案。

<强>更新

所以你想要一个工具为你做这件事吗?我听说SwisSQL可以做这样的事情,但如果大多数查询都很简单,你可以编写一个小脚本来为你做。 OMG Ponies回答很好地展示了从旧语法转换为新语法的模式。

答案 2 :(得分:2)

即使是简单的情况,例如

,这也会变得非常复杂
WHERE e.id = d.manager_id(+) OR e.id = d.contact_id(+)

将转换为UNION或subselect查询。

如果你喜欢python,你可能会看一下sqlparse,它看起来很有希望,你可能会得到你需要的东西以及一些重新格式化的SQL代码。它很容易直接在源上工作。你必须告诉它该怎么做,但它确实减轻了你编写枯燥的解析部分的麻烦。

答案 3 :(得分:1)

对于Oracle 10g

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries006.htm#i2054012

如果你的版本不同,你可以在线找到其他版本的oracle手册,虽然连接语法可能没有什么不同。

答案 4 :(得分:1)

我似乎记得在从Oracle 8i到9i的转换过程中这种语法消失了 - 我认为我们有一个toad插件最终为我们转换了一切,所以我们不必浪费时间来完成每个查询< / p>

答案 5 :(得分:1)

我不知道有什么工具可以自动进行转换,但即使有,也可以根据需要逐个审核其更改。因此,我认为工具不会为您节省太多时间。

http://www.dba-oracle.com/oracle_news/2004_2_19_rittman.htm说:

  

使用ANSI连接而不是传统连接没有性能优势或打击,但通过使用ANSI连接,您的查询在DBMS平台之间更易于移植,并且它们更容易阅读。但最终,这取决于个人偏好,虽然ANSI标准有优势,但如果你不愿意,则无​​需切换。

此外,您不必在任何地方使用一种风格。您可以一次转换一个查询代码,并确保它们都能继续工作。我会保留查询,并决定在新代码中使用ANSI SQL-92语法。