У меня есть три таблицы (здесь упрощенно):
recipients: recipientId, isGroup
users: userId, first name, last name
groups: groupid, groupname
Я хочу получить имя / фамилию, если получатель является пользователем, и имя группы, если получатель является группой.Возможно, что получатель не тот (то есть группа, которая была удалена / больше не существует), поэтому в этом случае я не хочу ничего возвращать.
Так вот, что я сделал:
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or g.groupname IS NOT NULL
Приведенный выше запрос не возвращает ожидаемых результатов.Я получаю это обратно:
adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
null, null, null, 1
Последняя строка неожиданна, поскольку явно нет имени группы (g.groupname имеет значение NULL) и r.IsGroup = 1.
Когда ясделать это:
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL
Я получаю ожидаемые результаты:
adam, smith, null, null
yolanda, smith, null, null
И когда я делаю это:
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where g.groupname IS NOT NULL
Я получаю ожидаемые результаты:
null, null, members, 1
Только когда я объединяю два предложения where с OR, я получаю дополнительную строку.
Теперь, когда я изменяю свой запрос на (изменить IS NULL на ISNULL):
select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or ISNULL(g.groupname, null) IS NOT NULL
Я получаю ожидаемые результаты:
adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
На самом деле, мне даже не нужно менять предложение where, следующий запрос также работает так же хорошо и дает мне ожидаемыйрезультат показан выше:
select u.first_name, u.last_name, ISNULL(g.groupname,null), r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or g.groupname IS NOT NULL
ТАК, вопрос, ПОЧЕМУ? Почему размещение ISNULL в моем операторе SELECT меняет работу предложения WHERE? Почему это вообще меняет дело? Почему мой первый запрос не работает? Почему он не функционирует, только когда я добавляю ИЛИ - почему он тоже не сломается?
Заранее спасибо.
Я использую MS SQL Server 2008.
правки: исправлена опечатка, уточнен вопрос