是否有内连接的替代方案

时间:2014-05-04 16:10:08

标签: sql oracle

这两个代码之间有什么不同吗

select a.firstname,
       a.lastname,
       b.salary,
       b.designation
from table a,
     table b
where a.id = b.id

select a.firstname,
       a.lastname,
       b.salary,
       b.designation
from table a inner join table b on a.id = b.id

1 个答案:

答案 0 :(得分:3)

功能上,不,这些特定查询是相同的。第二种是使用ANSI连接语法,它自SQL-92以来一直是标准,并且可在Oracle since 9i中使用。虽然两者仍然有效,但在使用外连接时,还需要使用ANSI语法。

新风格通常是首选,部分原因是旧风格可以通过省略连接条件而意外地引入笛卡尔产品 - 您无法使用join语法(意外;如果你真的想故意这样做,你仍然可以做cross join,这可以说你的加入/过滤意图更清晰。许多人发现它更容易阅读,但这是一个意见问题,所以这方面是偏离主题的。

Oracle recommend you use ANSI joins,至少对于外连接。您可以从计划和跟踪中看到Oracle实际上仍然在内部将ANSI语法转换为旧格式,因此只要您的查询正确(即没有丢失条件),就没有性能差异;并且优化器仍然可以选择使用基于where子句的索引,而不仅仅是on子句。

如果您是Oracle新手,那么很多人会建议您从一开始就使用ANSI语法。当然,不是每个人都同意;例如,对于持异议的声音有一个参考here