【发布时间】:2015-04-13 05:30:12
【问题描述】:
我使用 SQL Server db 已经有一段时间了,我会在那里 在我的查询中到处加入表格。
现在我有一个使用 Oracle db 的项目,当我浏览时 一些 oracle 程序员编写的程序,复杂 数据选择 查询时,我注意到她从未使用过联接。
问题:
Oracle 是否有任何具体的暗示不使用连接,或者它的人为因素?
【问题讨论】:
-
不,在需要的地方使用连接。它们是 SQL 的一部分。
我使用 SQL Server db 已经有一段时间了,我会在那里 在我的查询中到处加入表格。
现在我有一个使用 Oracle db 的项目,当我浏览时 一些 oracle 程序员编写的程序,复杂 数据选择 查询时,我注意到她从未使用过联接。
问题:
Oracle 是否有任何具体的暗示不使用连接,或者它的人为因素?
【问题讨论】:
没有。与任何其他合理的关系数据库一样,Oracle 在执行基于集合的操作和执行联接时比在程序上模拟联接(例如嵌套游标循环)时效率更高。
不过,我的猜测是,您实际上并不是在谈论缺少连接的代码。我的猜测是您正在谈论使用与您习惯不同的连接语法的代码。两者都有
SELECT a.*
FROM a
JOIN b ON (a.a_id = b.a_id)
JOIN c ON (b.b_id = c.b_id)
和
SELECT a.*
FROM a,
b,
c
WHERE a.a_id = b.a_id
AND b.b_id = c.b_id
是连接a 到b 到c 的查询。这两个查询完全相同——Oracle 解析器实际上会在内部将第一个查询重写为第二个查询。唯一的区别是第一个查询使用较新的 SQL 99 语法来指定它的连接。
从历史上看,Oracle 采用 SQL 99 语法相对较晚,有大量代码是在 SQL 99 语法可用之前编写的,而且相当多的 Oracle 人出于习惯而更喜欢旧式语法,如果没有的话别的。由于所有这些原因,仅使用旧的连接语法查找基于 Oracle 的项目是相对常见的。这本身并没有什么问题(尽管我个人更喜欢较新的语法)。
【讨论】: