在声明备选

时间:2015-10-26 07:01:37

标签: sql sql-server

我在下面有以下sql查询:

select *
from a
inner join b on b.id in
(select c.id from c
where c.someid = a.someid)
or a.someid = b.id

这是按预期工作但执行时间不好(4行10秒)

我尝试了很多替代品,但结果不同。我很难做到声明。

3 个答案:

答案 0 :(得分:2)

您的查询看起来很好。 b.id匹配a.someid或我们必须查找c的{​​{1}}个条目。关于这一点我们无能为力,只需要在两个地方看一下就很费力。当然,所有ID都应该有索引,但建议在a.someid上使用复合索引以便更快地查找。

除此之外,您可以尝试使用c(someid,id)代替EXISTS。可以预期这两者会导致大致相同的执行计划,但由于某种原因,某些DBMS处理IN优于EXISTS

IN

答案 1 :(得分:1)

检查这个..

select *
from a
inner join b 
on a.someid = b.id
join table 
(select c.id as id  from c
where c.someid = a.someid) X
on x.id = b.id

答案 2 :(得分:0)

感谢您的回答。我学到了很多。不幸的是,EXISTS对我的案例不起作用。我使用了UNION,结果时间是2秒。

select *
from a
inner join b on b.id in
(select c.id from c
where c.someid = a.someid)

union

select *
from a
inner join b on b.someid = a.id