这两个陈述之间是否有任何区别:
-- 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。我正在做我自己的侦探工作,以确定它们是否相同,时间差异,希望专家可以解释它是否存在技术差异。
答案 0 :(得分:1)
它们不是同一个查询,子查询中缺少一个条件,该条件取决于子查询中是否包含TABLE2
的所有列和所有列名。如果子查询涉及选择列表中TABLE2
的所有列名,则它们是相同的查询,并且子查询是不必要的。对于子查询,我在parens中的join语句之后引用带有select语句的部分。
第一个使用TABLE2
及其所有列,所有这些列都将在符合条件的结果集中使用。
然而,在第二个表格中,您JOIN
的表格不是您的TABLE2
,而是一个只包含子查询中TABLE2
列的表SELECT
id
1}}列表,即a
,b
,c
和WHERE
。但它将包含此子查询之后的所有行,因为子查询中的TABLE2
子句没有强制执行任何条件。
您将拥有相同数量的行,只有选定的列参与JOIN
。
第二个不一定是写得不好的。在TABLE2
linksService
.promoted(Extras.APP_KEY, page, Sort.DAY)
.subscribeOn(Schedulers.newThread())
.flatMapIterable(list -> list)
.subscribe(link -> {
view.appendLinks(link);
});
之前,您可以要满足条件。