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