我有一张桌子说ActionRole:
RoleId ActionId
31 1
31 2
31 3
32 1
32 4
33 2
33 4
34 5
34 6
我需要表中所有映射的所有RoleId 与RoleId对应的ActionId不在列表{1,3,7,11}
中我需要RoleId为{33,34}作为最终答案
从ActionRole中选择RoleId,其中ActionId不位于(1,3,7,11)
这是我尝试过的。但是它没有按预期工作,我怀疑 这是因为:
由于RoleId 31具有ActionId'1'和'2',因此,对于ActionId'2'
,ActionId不在{1,3,7,11}中,因此该RoleId也位于我的
我不需要的结果。我需要所有没有的RoleId
提供的列表中所有相关的ActionId
Select RoleId from ActionRole where ActionId not in(1,3,7,11)
我需要使用RoleId为{33,34}作为最终答案。这些是RoleId,不需要 包含列表中提到的任何关联的ActionId。
答案 0 :(得分:0)
Declare @t table (RoleId int , actionId int)
insert into @t values (31,1)
insert into @t values (31,2)
insert into @t values (31,3)
insert into @t values (32,1)
insert into @t values (31,4)
insert into @t values (33,2)
insert into @t values (33,4)
insert into @t values (34,5)
insert into @t values (34,6)
select * from @t t1
where not exists ( select 1 from @t t where t1.RoleId=t.RoleId and actionId in (1,3,7,11))
答案 1 :(得分:0)
使用子查询
select distinct RoleId from ActionRole
where RoleId not in (
select RoleId from ActionRole where ActionId in(1,3,7,11)
)
RoleId
33
34
答案 2 :(得分:0)
我假设您有一个单独的Roles
表。如果是这样,则更有效的版本是:
select r.RoleId
from Roles r
where not exists (select 1
from ActionRole ar
where ar.RoleId = r.RoleId and
ar.ActionId in (1, 3, 7, 11)
);
我也强烈建议您从不对子查询使用NOT IN
。如果子查询中的任何返回值是NULL
,它的行为就不会达到您的预期。 NOT EXISTS
表现直观。