[英]Is a Join equivalent to a query with a subquery for a column?
对不起,新手SQL问题,但不是同一回事:
select a.productid, sum(b.qty)
from table1 a
inner join table2 b on b.productid = a.productid
group by a.productid
;
select a.productid
,(select sum(b.qty) from table2 b where b.productid = a.productid)
from table1 a
group by a.productid
;
为什么有人会在选择中使用上面的查询,这是一些老派的事情要忘记使用,还是我应该考虑将其用于将来可能出现的一些问题?
不,它们实际上不是一回事。 有多种差异,但最明显的就是join
将筛选出任何不匹配的行。 相关子查询将返回第一个表中的所有行。
也有其他差异。 如果第一个表中有重复的productid
, sum()
将会不同。 执行计划将有所不同(因为结果集不同)。 在某些情况下,相关的子查询会更快。
更一般地,在某些情况下,相关子查询是表达逻辑的最简单方法。 并且,如上所述,在某些情况下,它还可以产生最快的执行计划。
第一个查询:
select a.productid, sum(b.qty)
from table1 a
inner join table2 b on b.productid = a.productid
group by a.productid
如果table2中没有相应的值,则不会返回row。
第二个查询就像LEFT JOIN
:
select a.productid
,(select sum(b.qty) from table2 b where b.productid = a.productid)
from table1 a
group by a.productid
<=>
select a.productid, sum(b.qty)
from table1 a
left join table2 b on b.productid = a.productid
group by a.productid
注意性能...内部联接比子选择要快得多。 子选择遍历所有匹配结果,因此复杂度为N x M ...导致性能不佳。 在大多数情况下,联接具有更好的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.