Две таблицы получают значения с общим значением или без значения в другой таблице - PullRequest
0 голосов
/ 07 февраля 2019

У нас есть две таблицы.

Таблица 1 - Пользователи: содержит пользователей

Таблица 2 - Ограничения: Пользователь, имеющий доступ только к определенной комнате.Если пользователя нет в этой таблице, он может получить доступ ко всем комнатам.

enter image description here

Теперь мне нужен запрос, где я прохожу комнату, и он возвращаетпользователи, которые имеют доступ.Например, я передаю RoomId = 70, и мой ожидаемый результат - 1, 3, 1, потому что он фактически имеет доступ только к комнате 70 и 3, поскольку, поскольку он не находится в таблице ограничений, он имеет доступ ко всем комнатам.

Проблема заключается в том, что при внутреннем объединении я теряю номер 3, а при левом соединении я сохраняю номер 2. Поэтому я не могу понять , как связать таблицы .Есть ли способ сделать это напрямую с помощью соединений?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вы можете попробовать с UNION

SELECT usr.UserID  FROM Users usr 
JOIN Restrictions res ON usr.UserID = res.UserID
WHERE res.RoomID = @myParameter --we take the users permitted for given room

UNION

SELECT UserID
FROM Users
WHERE UserID NOT IN (
        SELECT DISTINCT UserID
        FROM Restriction
        ) --plus the users that have permission in all rooms
0 голосов
/ 07 февраля 2019

Я настоятельно советую вам не использовать not in с подзапросом.Это просто опасная привычка.Если подзапрос возвращает любые NULL значения, то внешний запрос возвращает без строк .

Итак, я бы порекомендовал:

select userid
from users u
where exists (select 1
              from restrictions r
              where r.userid = u.userid and
                    r.roomid = 70
             ) or
      not exists (select 1
                  from restrictions r
                  where r.userid = u.userid
                 );

Я также настоятельно рекомендую вам изменить модель данных.Если у кого-то есть доступ к одной комнате, и этот ряд удален из restrictions, он получит доступ ко всем комнатам.Это кажется опасным.Вы должны явно указать все комнаты, к которым пользователи имеют доступ.

0 голосов
/ 07 февраля 2019

Я думаю, это должно работать.Вам не нужно join, чтобы решить проблему.

select 
     userid
from
     users u
where
     userid is not in (
        select 
            userid 
        from 
            restrictions 
        where 
            userid = u.userid 
            and roomid = @roomId
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...