前言
最近,我看到太多极客评论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/