0

在 MS SQL Server 2008 中,有如下表:


CREATE TABLE SomeTable
(
   MajorID int NOT NULL REFERENCES ...,
   MinorID int NOT NULL,
   Value   int NOT NULL REFERENCES ...,
   PRIMARY KEY(MajorID, MinorID)
)

我也有一组(Value0,Value1,...)。目标是找到所有这些 MajorID 至少列出一次集合中的每个值。MinorID 在此任务中并不重要。集合的大小不是预定义的,集合是在客户端应用程序中生成的。它的最大大小有一个合理的限制,比如 64。

我应该使用什么 SQL?

例子:

主要ID 次要ID 值
      1 0 4
      1 1 1
      1 2 3
      1 3 4
      1 4 4
      1 5 5
      1 6 5

      2 0 1

      3 0 1
      3 1 4

对于值列表 (1, 4),答案是 (1, 3),因为 MajorID 1 和 3 的每个值至少列出一次。

4

2 回答 2

4

您可以使用聚合来执行此操作,如下查询:

select majorid
from t
group by majorid
having COUNT(distinct value) = (select COUNT(distinct value) from t)

having子句检查 a 的所有值是否存在majorid

这适用于所有值。如果你有一个值列表,那么试试这个:

with valuelist as (
      select 1 as vslue union all
      select 4
)
select majorid
from t join
     valuelist vl
     on t.value = vl.value
group by majorid
having count(distinct value) = (select count(*) from valuelist)
于 2013-04-26T13:19:38.767 回答
1

这是简单的方法:

select majorid
from ReportStack
where value in (1, 3)
group by majorid
having count (distinct value) = 2

此查询的唯一维护问题是确保有子句值(2在此查询中)与目标值列表的大小相同。

于 2013-04-26T13:35:21.387 回答