powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка на вхождение в один из нескольких наборов
7 сообщений из 7, страница 1 из 1
Проверка на вхождение в один из нескольких наборов
    #39956952
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В БД есть таблица пользователей, в которой хранятся собственно пользователи и роли пользователей (у ролей дополнительно задано is_role=1).
Также в БД есть таблица связей между пользователями и ролями (какие роли назначены пользователям).
Мне нужно проверить, задана ли у пользователя одна (любая) из ролей.
Я делаю это так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select ...
, sign(coalesce(R106.STAFF_ID, 0)) as IS_DEMO
, sign(coalesce(R97.STAFF_ID, R98.STAFF_ID, 0)) as IS_STAFF
, sign(coalesce(R94.STAFF_ID, 0)) as IS_ADMIN
from BM_STAFF S
left join BILLING.BM_STAFF_ROLE R94 on (R94.STAFF_ID = S.STAFF_ID and R94.ROLE_ID = 94)
left join BILLING.BM_STAFF_ROLE R97 on (R97.STAFF_ID = S.STAFF_ID and R97.ROLE_ID = 97)
left join BILLING.BM_STAFF_ROLE R98 on (R98.STAFF_ID = S.STAFF_ID and R98.ROLE_ID = 98)
left join BILLING.BM_STAFF_ROLE R106 on (R106.STAFF_ID = S.STAFF_ID and R106.ROLE_ID = 106)


Это нормально? Или есть более удачные способы?
...
Рейтинг: 0 / 0
Проверка на вхождение в один из нескольких наборов
    #39956954
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Это нормально?
Честно сказать? Лично я не приемлю говнокод с литеральными константами.

P.S. А над стошестым анекдотом надо плакать или смеяться? А если при дамах?
...
Рейтинг: 0 / 0
Проверка на вхождение в один из нескольких наборов
    #39956987
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Я делаю это так:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
select ...
, (select 'Задана любая из ролей' from dual 
      where exists(select null from BM_STAFF_ROLE 
                         where STAFF_ID = S.STAFF_ID and R106.ROLE_ID in(94,97,98,106)
  ))
from BM_STAFF S
 
...
Рейтинг: 0 / 0
Проверка на вхождение в один из нескольких наборов
    #39957044
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как таким способом реализовать ИЛИ? union внутри вложенного запроса?
И я считал, что join 1:1 практически всегда лучше, чем скалярный подзапрос.
...
Рейтинг: 0 / 0
Проверка на вхождение в один из нескольких наборов
    #39957051
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
А как таким способом реализовать ИЛИ? union внутри вложенного запроса?
И я считал, что join 1:1 практически всегда лучше, чем скалярный подзапрос.

Уточните пожалуйста свой вопрос.
...
Рейтинг: 0 / 0
Проверка на вхождение в один из нескольких наборов
    #39957062
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не одно флаговое поле, а три, мне необходимо различать, в какой из наборов ролей входит запись. Разве одним скалярным подзапросом это сделать? Нужно три разных, в каждом свой список ролей.
Разве в этом случае join не лучше?
...
Рейтинг: 0 / 0
Проверка на вхождение в один из нескольких наборов
    #39957069
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Разве в этом случае join не лучше?

Лучше один join в любом варианте, чем три.
Если требуется различать - то подойдет любой вариант pivot при одном соединении.
Что касается скалярного подзапроса - посмотрите на план, это тоже join, в заявленном изначально требовании " проверить, задана ли у пользователя одна (любая) из ролей" он вполне уместен.
...помимо прочего, попробуйте представить, что у Вас не три роли, а 533 или роли образуют иерархию (могут включать роли) - должно стать понятнее.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка на вхождение в один из нескольких наборов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]