7

我一直在移植 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 个这样的查询要移植..

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

4

6 回答 6

22

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

是否由符号附加到哪个表和列引用确定RIGHT。如果它被指定在与子句中的第LEFT一个表关联的列旁边- 它是一个连接。否则,它是一个连接。 对于任何需要了解 JOIN 之间区别的人来说,这是一个很好的参考FROMRIGHTLEFT

使用 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
于 2010-03-11T15:45:56.923 回答
3

谷歌“Oracle 连接语法”。(+)用于不同风格的外连接。我认为您展示的第一个是左外连接,第二个是右外连接。我已经有一段时间没有看到这个符号了,所以我可能会有点偏离,但希望这可以为您提供足够的信息来访问 Google 并获得正确的答案。

更新:

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

于 2010-03-11T15:00:20.680 回答
2

即使在简单的情况下,如 WHERE 子句,这也会变得相当复杂,例如

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

将转换为 UNION 或子选择查询。

如果你喜欢 python,你可以看看sqlparse,它看起来很有前途,你可能会得到它来做你需要的事情,再加上一些重新格式化的 SQL 代码。它可以很容易地直接在源上工作。您必须告诉它该做什么,但它确实使您不必编写无聊的解析部分。

于 2010-03-19T16:21:40.217 回答
1

对于 Oracle 10g

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

如果你的版本不同,你可以在网上找到其他版本的 oracle 手册,尽管连接语法可能没有不同。

于 2010-03-11T15:06:33.973 回答
1

我不知道有一种工具可以自动进行转换,但即使有,你还是想逐案审查它的变化。因此,我认为工具不会为您节省很多时间。

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

使用 ANSI 联接而不是传统联接没有性能优势或受到影响,但是通过使用 ANSI 联接,您的查询在 DBMS 平台之间更具可移植性,并且它们更易于阅读。最后,这取决于个人喜好,虽然 ANSI 标准有优势,但如果您不想切换,则无需切换。

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

于 2010-03-19T21:38:01.883 回答
1

我似乎记得这种语法在从 Oracle 8i 到 9i 的过渡中消失了——我认为我们有一个 toad 插件,它最终为我们转换了所有内容,这样我们就不必浪费时间处理每个查询

于 2010-03-12T19:12:33.480 回答