2011-03-14 163 views
1

這是事情 - 我需要根據字段組篩選記錄。原型應該是這樣的:根據字段組篩選記錄

select distinct ID, Name from Item i 
inner join (select ItemID from ItemD where ItemDID in (146,147)) idd1 on i.ItemID = idd1.ItemID 
inner join (select ItemID from ItemD where ItemDID in (7641, 7648)) idd2 on i.ItemID = idd2.ItemID 

(重複內加入夫婦多次)

我知道我可以創建一個使用sp_executesql的存儲過程和餵養它的內部,從我的應用程序加入,但我不禁想知道有沒有更好的解決方案?

+0

我不明白你的問題是什麼。您正在尋找更好的方式來使用此查詢或傳遞此範圍值?首先:WHERE ItemID IN(xxx)OR ItemID IN(yyy)OR ItemID IN(zzz)將比多個連接方式快得多。 – Silx 2011-03-14 21:27:31

+0

我可以畫你很多雲來解釋我的問題和你提出的答案之間的區別,但那會浪費時間 – Vnuk 2011-03-15 07:24:49

回答

2

你可以使用一個臨時表,可能更快,比很多的聯接:

Conditions: GroupID, ItemDID 

並填寫喜歡:

1, 146 
1, 147 
2, 7641 
2, 7648 

然後要求每個條件組被滿足:

select ID 
,  Name 
from Item i 
where not exists 
     (
     select * 
     from Conditions c 
     left join  
       ItemID idd 
     on  idd.ItemDID = c.ItemDID 
       and idd.ItemID = i.ItemID 
     group by 
       c.GroupID 
     having count(idd.ItemDTD) = 0 
     ) 

(查詢沒有測試過;有很多種類。)