[英]Convert Where IN sub-query to an inner join
可以将以下查询转换为使用内部联接而不是where IN子查询吗?
select i.*, it.*
from ItemTypes it
inner join Items i on (i.itemTypeID = it.ItemTypeID)
where i.itemID IN (......)
我可能在子查询中返回了100个结果,我想避免在子查询中使用它。
您可以使用WITH公用表表达式(CTE) :
;with SelectedItems (selectedIDs) as
(
select distinct itemID from [...] where [...]
)
select i.*, it.*
from ItemTypes it
inner join Items i on i.itemTypeID = it.ItemTypeID
inner join SelectedItems on selectedIDs = i.itemID
您还可以使用索引定义临时#Table以保存选择:
create table #SelectedItems
(
selItemID int primary key clustered
)
insert into #SelectedItems (selItemID)
select [...]
select i.*, it.*
from ItemTypes it
inner join Items i on i.itemTypeID = it.ItemTypeID
inner join #SelectedItems si on si.selItemID = i.itemID
drop table #SelectedItems
但无论你做什么,在任何改变之前和之后都要小心测量性能。
select i.*, it.*
from ItemTypes it
inner join Items i on (i.itemTypeID = it.ItemTypeID)
inner join (select itemID from Items where ...) i2 ON i.itemID = i2.itemID
你可以像这样写
select i.*, it.*
from ItemTypes it
inner join Items i on (i.itemTypeID = it.ItemTypeID)
inner join (select distinct itemID from [...] where [...]) i2
on (i.itemID = i2.itemID)
但我怀疑你会从中获益。 毕竟,现代数据库倾向于为常见查询和子句找到最佳执行计划。 但是,在这种情况下,可能需要额外的工作来使用distinct
运算符去掉重复项
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.