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 |
1
和 2
是结果的一部分,因为它们的 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
给定一个 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 |
1
和 2
是结果的一部分,因为它们的 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