SQLQuery根据条件进行搜索

时间:2019-06-28 06:34:50

标签: sql database sql-server-2012

我有一张桌子说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。

3 个答案:

答案 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)
 )

demo link

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表现直观。