У меня есть таблица с надписью ActionRole:
RoleId ActionId
31 1
31 2
31 3
32 1
32 4
33 2
33 4
34 5
34 6
Мне нужны все 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 также входит в мой
результат, который мне не нужен. Мне нужны все идентификаторы ролей, которые не имеют
любой связанный ActionId, который находится в предоставленном списке
Select RoleId from ActionRole where ActionId not in(1,3,7,11)
Мне нужен RoleId как: {33,34} как окончательный ответ. Это RoleId, которые не содержать любой связанный ActionId, упомянутый в списке.


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))
использовать подзапрос
select distinct RoleId from ActionRole
where RoleId not in (
select RoleId from ActionRole where ActionId in(1,3,7,11)
)
RoleId
33
34
Я бы предположил, что у вас есть отдельная таблица 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 ведет себя интуитивно.