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语法。