2

我有两个名为“Item”(包含 ItemId 和 Title 列)和“ItemSpecificationValue”(包含 ItemId、ItemSpecificationValueId 列)的表。

    (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

比如说,我需要从“Item”表中提取所有行,该表至少有一个来自 rangeA: {50,55} 的 ItemSpecificationValueId 和至少一个来自 rangeB: {11,115,163} 的行。因此,您会看到唯一满足上述要求的项目是 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')
4

1 回答 1

2

这应该与使用COUNT一起工作CASE

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
于 2013-07-14T03:27:18.603 回答