【问题标题】:Difference between standard outer left join and join using select标准外左连接和使用选择连接之间的区别
【发布时间】:2017-01-05 22:27:52
【问题描述】:

这两种说法有区别吗:

 -- Statement 1:
 SELECT *
 FROM Table1 t1
     LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id

  -- Statement 2:
  SELECT *
  FROM Table1 t1
     LEFT OUTER JOIN (SELECT id, a, b, c FROM Table2) t2 on t1.id = t2.id

我不是专家,但语句 2 看起来就像写得不好的 sql,而且需要更长的时间。我正在尝试优化一个代码块,它有很多像第二个一样的连接。它们在技术上是否相同,我可以用标准连接语句 1 替换吗?

谢谢!

附言。这就是 Oracle,它处理数以百万计的行。

PSS。我正在做自己的侦探工作,以确定它们是否相同,以及时间差异,希望专家能够解释是否存在技术差异。

【问题讨论】:

  • 如果Table2的列数超过4列,那么语句2就是对结果集进行限制。数据越少加载速度越快。
  • 解释计划是你的朋友。
  • @DVJex:第二个只限制列数,不限制行数。
  • 第二个查询等价于SELECT t1.*, t2.id, t2.a, t2.b, t2.c FROM Table1 t1 LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id,如果这些都是 table2 的所有列,那么两个查询是 100% 相同的,Oracle 几乎肯定会为两者使用相同的执行计划。

标签: oracle select outer-join


【解决方案1】:

它们不是相同的查询,子查询中缺少一个条件,该条件取决于子查询中是否涉及TABLE2 的所有列和所有列名。如果子查询涉及选择列表中TABLE2 的所有列名,则它们是相同的查询,不需要子查询。对于子查询,我在括号中的 join 语句之后引用带有 select 语句的部分。

第一个使用 TABLE2 及其所有列,所有这些列都将在满足条件的结果集中可用。

但是,在第二个中,您创建的表 JOIN 不是您的 TABLE2,而是仅包含子查询的 SELECT 列表中指定的 TABLE2 中的列的表,即 id、@987654329 @、bc。但是它将包含此子查询之后的所有行,因为子查询中的 WHERE 子句没有对其强制执行任何条件。

您将拥有相同数量的行,只有选定的列参与TABLE2

第二个不一定是写得不好的。在JOINTABLE2 之前,您可能需要满足一个条件。

【讨论】:

  • 很有趣,谢谢。听起来它们是不同的,因为语句 2 只提供对 id、a、b 和 c 列的访问权限,因此可以访问 Table2 中的所有列。第二个是子查询这一事实是否会增加查询时间?我想我将不得不尝试找出一个是否比另一个快。谢谢!
  • @russd 如果您使用子查询,我不确定它是否会给查询增加额外的延迟。但由于没有条件,子查询中的where 子句可以完全省略。如果您想授予访问权限,或者只显示TABLE2 的某些列,只需将这些列放在第一个SELECT 列表中:SELECT t1.*, t2.id, t2.a, t2.b, t3.c FROM Table1 t1 LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id。您不需要为此创建子查询。
猜你喜欢
  • 1970-01-01
  • 2017-02-26
  • 2011-06-10
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多