我有一个像这样的SQL Server表

enter image description here

此表的架构和用于生成此表的示例插入查询:

CREATE TABLE demotable (
    Id int,
    PrivilageId int,
    RoleId int    
);

insert into demotable values (1 ,40, 101)
insert into demotable values (2 ,12, 101)
insert into demotable values (3 ,40, 102)
insert into demotable values (4 ,40, 104)
insert into demotable values (5 ,12, 128)
insert into demotable values (6 ,40, 107)
insert into demotable values (7 ,17, 103)
insert into demotable values (8 ,17, 107)
insert into demotable values (9 ,15, 138)
insert into demotable values (10 ,15, 102)
insert into demotable values (11 ,17, 104)
insert into demotable values (12 ,12, 101)

正如你所看到的,如果我想查看Privilage ID 40的所有RoleIDs,我可以通过这个查询轻松地得到它.

select * from DemoTable where PrivilageID =  40

这给了我101, 102, 104, 107的结果

但我的要求正好相反.我知道这个特殊的组合PrivilageID, 101, 102, 104, 107, 104, 107只有一个PrivilageID.我需要一个查询,我可以通过PrivilageID, 101, 102, 104, 107, 104, 107,我会得到一个40输出

我try 的是:我创建了如下相交查询:

select PrivilageId from DemoTable where RoleID = 101
intersect
select PrivilageId from DemoTable where RoleID = 102
intersect
select PrivilageId from DemoTable where RoleID = 104
intersect
select PrivilageId from DemoTable where RoleID = 107

这很管用,但还有更好的方法吗?

推荐答案

如果我理解正确,你可以用条件聚合函数COUNT和条件DISTINCT来try HAVING.

我们只需要在CASE WHEN表达式中添加过滤器RoleId,计数可能等于您的RoleId.

SELECT PrivilageId 
FROM DemoTable 
GROUP BY PrivilageId 
HAVING COUNT(DISTINCT CASE WHEN RoleId IN (101, 102, 104, 107) THEN RoleId END) = 4

sqlfiddle

Sql相关问答推荐

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

出现5次后,将所有正斜杠替换为连字符

转换表中的数据

如何查询jsonb列是一个对象数组?

SQL:如何取上一年的平均值?

返回找到的最小和最大row_number()spark SQL

SQL Athena/prest判断值是否在嵌套的json数组中

如何在android房间中进行多个加入

如何计算两个非周期性时间序列+分组的重叠持续时间

避免在SQL中使用具有相同条件的多个子查询

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

joins 组合多个重复数据删除策略

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

如何在 PL/SQL 中区分返回的 XML 值?

运算符不存在:integer = bigint[]

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

pyspark 将列转换为行

除以表中的几个元素