繁体   English   中英

将IN子查询转换为内连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM