【问题标题】:Oracle Different row counts using Join and without JoinOracle 使用 Join 和不使用 Join 的不同行数
【发布时间】: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)隐式连接如何容易发生类似的事情。

标签: sql oracle join select


【解决方案1】:

第二个查询被视为CROSS JOIN,因为这些表的列之间没有各自的连接条件,只是由于某个日期而存在限制,而第一个查询在具有常规@987654322的表之间具有标准的内部连接@ 条件。

【讨论】:

    【解决方案2】:

    第二个查询基本上是不正确的,因为在第二个和第三个表上没有连接条件,除了只有第一个表的日期限制。所以它基本上产生了从第一个表中选择的记录乘以第二个表上的所有记录乘以第三个表上的所有记录的笛卡尔积。

    第一个查询看起来更正确,它生成第一个表上的选定记录乘以 he.eid = hr.eid 连接的第二个表上的记录乘以 he.unit = un.unit_code 连接的第三个表上的记录

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2021-06-25
      • 2021-07-08
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      相关资源
      最近更新 更多