Oracle(旧?)join – 转换的工具/脚本?

我一直在移植oracleselect,而且我已经遇到了很多像这样的查询:

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这些查询端口..

这个标准什么时候被淘汰? 任何信息表示赞赏。

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

无论是RIGHT还是LEFT ,取决于符号所附的表格和列的引用。 如果在FROM子句中与第一个表关联的列的旁边指定它 – 这是一个RIGHT连接。 否则,这是一个LEFT连接。 对于需要了解JOIN之间区别的人来说,这是一个很好的参考 。

使用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 

Google“Oracle连接语法”。 (+)用于不同风味的外连接。 我想第一个显示的是左外连接,第二个是右外连接。 我有一段时间没有看到这个符号,所以我可以稍微rest一下,但是希望这会给你足够的信息来打击Google,并得到正确的答案。

更新:

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

在甚至简单的情况下,这可能会变得非常复杂,如WHERE子句

 WHERE e.id = d.manager_id(+) OR e.id = d.contact_id(+) 

将转换为UNION或子查询。

如果你喜欢python,你可能会看看sqlparse ,它看起来很有希望,你可能会得到它来做你所需要的,再加上一些重新格式化的SQL代码。 它很容易直接在源文件上工作。 你将不得不告诉它该做什么,但它确实减轻了你写无聊的parsing部分。

对于Oracle 10g

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

如果你的版本不同,你可以在网上find其他版本的oracle手册,尽pipejoin语法可能没有什么不同。

我似乎记得在从Oracle 8i转换到9i时,这种语法已经消失了 – 我想我们有一个蟾蜍插件,最终为我们转换了所有东西,所以我们不必浪费时间去查看每个查询

我不知道有一个工具可以自动进行转换,但即使有,也要根据具体情况逐个检查其更改。 因此,我不认为一个工具会为你节省很多时间。

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

通过使用ANSI连接而不是传统的连接,没有任何性能优势或者命中,但是通过使用ANSI连接,您的查询在DBMS平台之间更具可移植性,并且易于阅读。 最后,虽然这取决于个人喜好,而ANSI标准有其优点,但是如果你不想要,也不需要切换。

你也不必使用一种风格或其他地方。 您可以一次转换您的代码一个查询,有一些保证,他们将继续工作。 我会离开查询,并解决在新代码中使用ANSI SQL-92语法。