sql - Oracle加入-常规语法VS ANSI语法之间的比较

标签 sql oracle oracle11g oracle10g oracle12c

前言

最近,我看到太多极客评论Oracle问题,说“不要使用(+)运算符,而要使用JOIN语法”。

问题

我确实看到两者都运作良好。但是使用它们之间的真正区别是什么并使您感觉使用它们?我欢迎您回答,更多来自经验。

 1. Is there anything to do with limitations in application, performance, 
    etc. while using them?

 2. What would you suggest for me?

我确实在Oracle documentation上阅读了一些内容,但不足以使我理解或接受这些综合信息。

注意:如果要使用关键字而不是(+),我计划迁移200多个软件包和过程。
  3. Also is there any freeware tools to do the rewrite?

发布示例
┌───────────────────────────────────┬─────────────────────────────────────────────┐
│ INNER JOIN - CONVENTIONAL         │ INNER JOIN - ANSI SYNTAX                    │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      emp.deptno                   │       ename,                                │
│ FROM                              │       dname,                                │
│      emp,                         │       emp.deptno,                           │
│      dept                         │       dept.deptno                           │
│ WHERE                             │ FROM                                        │
│      emp.deptno = dept.deptno;    │       scott.emp INNER JOIN scott.dept       │
│                                   │       ON emp.deptno = dept.deptno;          │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ LEFT OUTER JOIN - CONVENTIONAL    │ LEFT OUTER JOIN - ANSI SYNTAX               │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      emp.deptno                   │      ename,                                 │
│ FROM                              │      dname,                                 │
│      emp,                         │      emp.deptno,                            │
│      dept                         │      dept.deptno                            │
│ WHERE                             │ FROM                                        │
│      emp.deptno = dept.deptno(+); │      scott.emp LEFT OUTER JOIN scott.dept   │
│                                   │      ON emp.deptno = dept.deptno;           │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ RIGHT OUTER JOIN - CONVENTIONAL   │ RIGHT OUTER JOIN - ANSI SYNTAX              │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      emp.deptno                   │      ename,                                 │
│ FROM                              │      dname,                                 │
│      emp,                         │      emp.deptno,                            │
│      dept                         │      dept.deptno                            │
│ WHERE                             │ FROM                                        │
│      emp.deptno(+) = dept.deptno; │      scott.emp RIGHT OUTER JOIN scott.dept  │
│                                   │      ON emp.deptno = dept.deptno;           │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ FULL OUTER JOIN - CONVENTIONAL    │ FULL OUTER JOIN - ANSI SYNTAX               │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      *                            │      *                                      │
│ FROM                              │ FROM                                        │
│      emp,                         │      scott.emp FULL OUTER JOIN scott.dept   │
│      dept                         │      ON emp.deptno = dept.deptno;           │
│ WHERE                             │                                             │
│      emp.deptno = dept.deptno(+)  │                                             │
│ UNION ALL                         │                                             │
│ SELECT                            │                                             │
│      *                            │                                             │
│ FROM                              │                                             │
│      emp,                         │                                             │
│      dept                         │                                             │
│ WHERE                             │                                             │
│      emp.deptno(+) = dept.deptno  │                                             │
│      AND emp.deptno IS NULL;      │                                             │
└───────────────────────────────────┴─────────────────────────────────────────────┘

PS :阅读分组的所有更新的答案摘要。

最佳答案

如果您的200多个软件包使用“老式”语法可以正常工作,请顺其自然。
迁移到ANSI语法后,SQL不会开始表现出更好的性能-只是语法不同。
这么说,ANSI语法更简洁-如果您忘记了某些多列外部联接中的(+),就不会进行常规联接。
过去,ANSI语法中存在一些错误,但是如果您使用最新的11.2或12.1,则应该已经修复。

当然,您更了解自己的环境和优先级-正如SchmitzIT所说-ANSI语法是SQL标准的一部分,在使用其他RDBMS产品时会有所帮助。

关于sql - Oracle加入-常规语法VS ANSI语法之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18891148/

相关文章:

sql - 非常基本的 IF EXISTS 语句不起作用

mysql - Oracle 从嵌套表中删除

MySQL - 使用新 ID 插入表

mysql - 如何通过检查特定字段是否以给定数组中的值开头来进行查询?

sql - Oracle是否使用短路评估?

sql - Oracle使用with子句创建表

java - 持久化JPA后获取UniqueID

来自 URL 的正则表达式子字符串

database - Oracle - 权限不足

MySql数据库备份转储文件到oracle 11g