簡體   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