SQLQuery для поиска по критериям - PullRequest
0 голосов
/ 28 июня 2019

У меня есть таблица, скажем ActionRole:

 RoleId  ActionId
 31      1
 31      2
 31      3
 32      1
 32      4
 33      2
 33      4
 34      5
 34      6

Мне нужны все RoleId из таблицы, где любой из сопоставленных ActionId, соответствующих RoleId, отсутствует в списке {1,3,7,11}

Мне нужен RoleId как: {33,34} в качестве окончательного ответа

Выберите RoleId из ActionRole, где ActionId отсутствует в (1,3,7,11)

Это то, что япытался.Но это не работает должным образом, и я подозреваю, что это потому, что:

Поскольку RoleId 31 имеет ActionId '1', а также '2'. Поэтому для ActionId '2'
, ActionId нев {1,3,7,11}, так что этот RoleId также входит в мой результат, который мне не нужен. Мне нужны все RoleIds, которые не имеют никакого связанного ActionId, которые есть в списке

Select RoleId from ActionRole where ActionId not in(1,3,7,11)

Мне нужен RoleId как: {33,34} в качестве окончательного ответа. Это RoleIds, которые не содержат никаких связанных ActionId, упомянутых в списке.

Ответы [ 3 ]

0 голосов
/ 28 июня 2019

использовать подзапрос

select distinct RoleId from ActionRole 
where RoleId not in  (
select RoleId from ActionRole where ActionId  in(1,3,7,11)
 )

демонстрационная ссылка

RoleId
33
34
0 голосов
/ 28 июня 2019

Я бы предположил, что у вас есть отдельная таблица 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 ведет себя интуитивно.

0 голосов
/ 28 июня 2019
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))
...