SQL Select 当属性至少匹配一个值列表时的组

SQL Select a group when attributes match at least a list of values

给定一个 table 和一个(非不同的)标识符和一个值:

| ID | Value |
|----|-------|
|  1 |     A |
|  1 |     B |
|  1 |     C |
|  1 |     D |
|  2 |     A |
|  2 |     B |
|  2 |     C |
|  3 |     A |
|  3 |     B |

如何 select 具有给定列表值的分组标识符?(例如 ('B', 'C')

此列表也可能是另一个查询的结果(如 SELECT Value from Table1 WHERE ID = '2' 查找所有具有值超集的 ID,与 ID=2(本例中仅 ID=1)相比)

结果

| ID |
|----|
|  1 |
|  2 |

12 是结果的一部分,因为它们的 A B =21=]-列。 3 不包括在内,因为它缺少 C

感谢这个问题的回答:SQL Select only rows where exact multiple relationships exist 我创建了一个适用于固定列表的查询。但是我需要能够在不更改查询的情况下使用另一个查询的结果。 (并且还需要特定于 Access 的 IFF 函数):

SELECT ID FROM Table1
GROUP BY ID 
HAVING SUM(Value NOT IN ('A', 'B')) = 0 
AND SUM(IIF(Value='A', 1, 0)) = 1 
AND SUM(IIF(Value='B', 1, 0)) = 1

以防万一:SQL 通过 VBA 和 ADODB 在 Excel-table 上 运行。

在您希望查看的值列表的 where 条件过滤器中,按 ID 分组,并在具有 3 个匹配行的那些 ID 的 having 子句过滤器中。

select id from table1
where value in ('A', 'B', 'C') --you can use a result of another query here
group by id
having count(*)=3

如果您可以多次拥有相同的 id - 值对,那么您需要稍微更改 having 子句:having count(distinct value)=3

如果你想让它基于子查询完全动态化,那么:

select id, min(valcount) as minvalcount from table1
cross join (select count(*) as valcount  from table1 where id=2) as t1
where value in (select value from table1 where id=2) --you can use a result of another query here
group by id
having count(*)=minvalcount