SQLQuery для поиска по критериям

У меня есть таблица с надписью 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, упомянутый в списке.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
36
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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 ведет себя интуитивно.

Другие вопросы по теме