标准外部左连接和使用 select 连接的区别

Difference between standard outer left join and join using select

这两种说法有什么区别吗:

 -- 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 替换?

谢谢!

Ps。这是 Oracle,并且处理数以百万计的行。

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

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

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

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

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

第二个不一定是写得不好的那个。在 JOINTABLE2.

之前,您可能需要满足一个条件