替代INTERSECT给定任意数量的条件

时间:2012-10-24 00:43:56

标签: sql sql-server

如果我有一张类似于以下内容的表格:

MyIds MyValues
----- --------
  1    Meat
  1    Fruit
  1    Veggies
  2    Fruit
  2    Meat
  3    Meat

如何创建一个查询,如果我获得了一个不同的MyValues的任意列表,它将为我提供与{{全部相匹配的所有MyIds 1}}。

示例:如果MyValues的列表包含[肉类,水果,蔬菜],我希望MyValues的{​​{1}}返回,因为MyIds有一个条目MyValues中每个值的表。

我知道如果给出1的特定列表,可以使用INTERSECT完成此操作。但我不知道如何使用任意数量的1

来完成

2 个答案:

答案 0 :(得分:3)

您需要计算满足条件的每个MyID的实例总数,并且它与IN子句中提供的值的数量匹配。

SELECT MyID
FROM tableName
WHERE MyValues IN ('Meat', 'Fruit', 'Veggies')
GROUP BY MyID
HAVING COUNT(DISTINCT myVAlues) = 3

SQLFiddle Demo

答案 1 :(得分:0)

一个很大的问题是如何表示清单。以下给出了一种方法,表示表中的列表:

with l as ( 
    select 'Meat' as el union all
    select 'Fruit' union all
    select 'Veggies'
)
select MyId
from t join
     l
     on t.MyValues = l.el
group by MyId
having count(distinct t.myvalues) = (select count(*) from l)