'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')