Позвольте мне предисловие к этому, сказав, что это не вопрос эффективности.Использование JOINs против IN/NOT IN для удобочитаемости
Скажем, ради аргумента у меня есть база данных с двумя таблицами: «Пользователи и роли».
Пользователи выглядит следующим образом:
Username Password FirstName LastName
-------- -------- ---------- ---------
braab pass1234 Braab Himself
joe pass1257 Joe Smith
robert pass1235 Robert Irvine
kelly pass1236 Kelly Clarkson
Роли выглядит следующим образом:
Username Role
-------- ----
braab admin
robert customer
kelly developer
joe admin
Я хочу, чтобы найти и фамилии всех пользователей, имеющих роль «администратора».
У меня есть два способа достичь этого: используя соединение или используя предложение in.
В методе:
select
firstname, lastname
from
users
where
username in
(select
username
from
roles
where
role = 'admin'
)
РЕГИСТРИРУЙТЕСЬ Метод:
select
user.firstname, user.lastname
from
users as user
inner join
roles as role
on
user.username = role.username
Какой путь более ясно, что я пытаюсь найти первые и последние имена пользователей администратора? Есть ли предполагаемое использование? Для меня эта статья является наиболее ясной для достижения поставленной цели.
В зависимости от вашего опыта/обучения с использованием SQL, я вижу, что это происходит в любом случае. Мое беспокойство заключается в том, что я хочу, чтобы другие разработчики могли понять, какую цель я пытаюсь достичь.
Помните, что 'NOT IN' может быть сложным, если подзапрос может возвращать' NULL'. Я бы использовал 'JOIN' над' IN/NOT IN', особенно когда подзапрос коррелирован. – lad2025
Может ли один пользователь иметь несколько ролей? В противном случае лучше добавить поле в таблицу «Пользователи». –
Эти два утверждения не обязательно возвращают одно и то же, например. когда пользователь может иметь более одной роли –