select
a,
b,
(select x from table3 where id = z.id) as c,
d
from
table1 z, table2 zz
where z.id = zz.id;
我知道可以像下面这样轻松简化查询:
select a,
b,
c.x,
d
from
table1 z,table2 zz, table3 c,
where z.id = zz.id and z.id = c.id;
但我想知道在case1中发生的性能影响或额外执行是什么,或者它们都具有相同的性能?要求知识。
答案 0 :(得分:1)
即使table3为空,带有相关子查询的第一个查询也将始终返回数据。您需要外部联接才能获得相同的结果:
select a,
b,
c.x,
d
from table1 z
join table2 zz on z.id = zz.id
left join table3 c on z.id = c.id
答案 1 :(得分:1)
使用join,查询更具可读性
但表现相同
select a,
b,
c.x,
d
from table1 z
join table2 zz on z.id = zz.id
join table3 c on z.id = c.id;
答案 2 :(得分:1)
如果你想使用相关的子查询(很好),你应该这样做:
select a, b,
(select t3.x from table3 t3 where t3.id = z.id) as c,
d
from table1 z join
table2 zz
on z.id = zz.id;
重要变化:
a
,b
和d
来自哪里。)join
。您也可以将此查询编写为:
select a, b, t3.x, d
from table1 z join
table2 zz
on z.id = zz.id left join
table3 t3
on t3.id = z.id;
此查询与前一个查询略有不同。如果子查询返回多行,则前一个将返回错误。这个将把每个这样的值放在不同的列中。
也就是说,Oracle优化器非常好。如果有任何明显的性能差异,我会感到惊讶。
答案 3 :(得分:1)
如果子查询基于单个输入返回单个值,则它是标量子查询。标量子查询可以提高查询的性能。它将在几个基本条件下完成。首先,如果z.id具有相对较少的可能值。如果我记得的话,标量子查询处理将缓存多达254个值。其次,如果查询的其余部分返回相对较多的行。在这种情况下,如果您只返回几行,则缓存将没有机会提供帮助。但是如果你返回很多行,那么缓存的好处就会增加。
其他人已经强调了您的原始查询不完全等同。
在此处查看有关标量子查询的更多信息 - > Scalar Subqueries