Правое соединение не возвращает нулевые значения

Мои таблицы:

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 именно так, как это требовалось.

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