使用select的标准外部左连接和连接之间的差异

时间:2016-08-29 19:38:20

标签: oracle select outer-join

这两个陈述之间是否有任何区别:

 -- 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看起来好像写得不好,而且需要更长的时间。我正在尝试优化代码块,它有许多连接,如第二个。它们在技术上是否相同,我可以用标准的连接语句1替换它?

谢谢!

聚苯乙烯。这是Oracle,并且使用了数百万行。

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

1 个答案:

答案 0 :(得分:1)

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

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

然而,在第二个表格中,您JOIN的表格不是您的TABLE2,而是一个只包含子查询中TABLE2列的表SELECT id 1}}列表,即abcWHERE。但它将包含此子查询之后的所有行,因为子查询中的TABLE2子句没有强制执行任何条件。

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

第二个不一定是写得不好的。在TABLE2 linksService .promoted(Extras.APP_KEY, page, Sort.DAY) .subscribeOn(Schedulers.newThread()) .flatMapIterable(list -> list) .subscribe(link -> { view.appendLinks(link); }); 之前,您可以要满足条件。