2013-07-14 62 views
2

我有兩個名爲'Item'(帶有ItemId和Title的列)和'ItemSpecificationValue'(帶有ItemId,ItemSpecificationValueId的列)的表。SQL Server - 爲同一列選擇兩個不同範圍的值的行

(Item Table) 
ItemId | Title       
    1  | abcd   
    2  | pqrs   
    3  | uvwx        

(ItemSpecificationValue Table) 
ItemId | ItemSpecificationValueId 
    1  | 11 
    2  | 50 
    2  | 55 
    2  | 115 
    3  | 11 
    3  | 163 

說,我需要從「項」表中,其具有從rangeA至少一個ItemSpecificationValueId提取所有行:{50,55}和至少一個從範圍b:{11115163}。 所以你看到滿足上述要求的唯一項目是ItemId 2的項目。

到目前爲止,我的工作如下。我想知道是否有任何簡單的方法可以做到這一點,除了參加工會之外,因爲我可能會獲得大量這樣的範圍,因此做大量的正確加入是不可行的。我可以將正確加入的結果保留在臨時表中。只是想知道是否有更聰明的方法。

SELECT Item.ItemId, Item.Title 
FROM Item 
    RIGHT JOIN ItemSpecificationValue 
     ON ItemSpecificationValue.ItemId = Item.ItemId 
WHERE ItemSpecificationValue.ItemSpecificationValueId in ('50','55') 
INTERSECT 
SELECT Item.ItemId, Item.Title 
FROM Item 
    RIGHT JOIN ItemSpecificationValue 
     ON ItemSpecificationValue.ItemId = Item.ItemId 
WHERE ItemSpecificationValue.ItemSpecificationValueId in ('11','115','163') 

回答

2

這應該使用COUNTCASE

select I.ItemId, I.Title 
from Item I 
    inner join ItemSpecificationValue ISV 
    on I.ItemId = ISV.ItemId 
group by I.ItemId, I.Title 
having count(case when ItemSpecificationValueId IN (50,55) then 1 end) > 0 
    and count(case when ItemSpecificationValueId IN (11,115,163) then 1 end) > 0 
+0

真棒!謝謝你sdesdes! –

+0

@ChamzDes - np,很高興能幫到你! – sgeddes

相關問題