2

'Item' (列 ItemId と Title) と 'ItemSpecificationValue' (列 ItemId、ItemSpecificationValueId) という名前の 2 つのテーブルがあります。

    (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 から少なくとも 1 つの ItemSpecificationValueId: {50,55} と rangeB から少なくとも 1 つ: {11,115,163} を持つ「Item」テーブルからすべての行を抽出する必要があるとします。したがって、上記の要件を満たす唯一のアイテムは、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 に答える