【发布时间】:2020-11-13 23:15:26
【问题描述】:
我有一个 Oracle 数据库,并使用下面的这个查询来获取记录以满足需求。来自三个表的五列和一个 where 条件。
select un.name, he.emp_no, he.lname, hr.in_unit, hr.out_unit
from hr_employee he
inner join hr_roster hr on he.eid = hr.eid
inner join units un on he.unit = un.unit_code
where hr.unit_date = to_date( '24-JUL-20','dd-MON-yy')
后来我意识到,如果在下面这样使用,没有 Joins 会稍微快一些。
select un.name, he.emp_no, he.lname, hr.in_unit, hr.out_unit
from hr_employee he, hr_roster hr, units un
where hr.unit_date = to_date( '24-JUL-20','dd-MON-yy')
但我注意到与上面的查询相比,获取的行有所不同。
当我对这两个查询进行行计数时,使用 Joins 的一个返回 1012 而另一个继续获取而没有计数。
我有点困惑,不知道哪个查询最适合使用。
【问题讨论】:
-
为什么你认为这些总是返回相同的东西?--根据文档证明。 (他们没有。)请不要要求我们重新编写另一个演示文稿。同样,在您观察到的任何情况下以及您未观察到的情况下,您声称第二次的文档证明理由是“稍微快一点”。 (并非总是如此。)如果您没有清楚地给出您的推理,我们无法解决您哪里出错或知道您的实际问题是什么。此外,当您无法确定您的理由时,您会发现您的问题是常见问题解答。
-
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
-
(不正确的)第二个查询是另一个很好的例子,为什么你不应该使用古老、过时和脆弱的隐式连接(提示:你没有在第二个语句中使用任何连接)
-
你说第二个“稍微快一点”,但它“不断获取而不计数”。所以它并不是真的更快:)
-
@philipxy 第二个查询不包含任何连接条件,这就是它“不正确”的原因,并且做的事情与第一个查询完全不同。使用“现代”(SQL-92)JOIN 运算符“忘记”连接条件是不可能的,因为这是语法错误,而不是产生错误结果的“运行时”错误。这就是为什么应该始终首选显式 JOIN 的原因,这个问题是另一个很好的例子,说明“旧”(SQL-89)隐式连接如何容易发生类似的事情。