Правое соединение не возвращает нулевые значения
Мои таблицы:
allowed(resourceid, personid)
person(personid, email)
Я хочу распечатать, имеет ли человек право на доступ к ресурсу, скажем, с помощью resourceid = 2. Результат должен быть:
personright(personid, email, resourceid)
и resourceid должен быть нулевым, если человеку не разрешен доступ к ресурсу 2. Если человеку разрешен доступ к 2, resourceid должен быть равен 2.
Поэтому я ожидаю, что каждый раз, когда выполняется мой запрос, выводится весь список пользователей.
У меня было рабочее решение с использованием подзапроса, но я хочу сделать это с помощью соединения.
select person.personid, person.email, allowed.resourceid
from person
right join allowed on(person.personid = allowed.personid)
where (allowed.resourceid IS NULL OR allowed.resourceid = 2);
Почему это не работает?
1 ответ
Исходя из вашего описания проблемы - следует оставить здесь, а не право.
select person.personid, person.email, allowed.resourceid
from person
left join allowed on person.personid = allowed.personid and allowed.resourceid = 2
Также обратите внимание, что я переехал allowed.resourceid = 2
состояние от where
пункт к условию соединения. Таким образом, если в allowed
стол с resourceid = 2
а также personid
равно соответствующему personid
от person
таблица - вы получите ноль как allowed.resourceid
именно так, как это требовалось.