Запрос SQL Server - возвращает значение null, если нет соответствия
У меня возникает проблема, которую я почему-то не могу понять. Я пытаюсь написать запрос, который объединяет две таблицы, в которых совпадение не может быть найдено в таблице. Например:
SELECT
Table1.IDField, Table2.IDField
FROM
Table1
LEFT OUTER JOIN
Table2 ON Table1.PersonID = Table2.PersonID
WHERE
(Table1.IDField = '12345')
AND (Table2.Category = 'Foo')
Если в Table2
нет совпадения, это ничего не возвращает. Однако мне нужно, чтобы он просто возвращал NULL для этого столбца, если нет совпадения и по-прежнему возвращает значение из Table1
.
Я изменил JOIN
со всем, что я могу придумать, но безрезультатно.
Table2.Category
может содержать несколько других значений, поэтому работа типа OR IS NULL
не будет работать.
Итак, если нет соответствия для Table2.Category = 'Foo'
, мне все равно нужно вернуть его:
Table1 | Table2
----------------
12345 | NULL
Любые предложения?
Ответы
Ответ 1
Переместите условие table2
из вашего предложения WHERE
и в JOIN
.
SELECT
Table1.IDField, Table2.IDField
FROM
Table1
LEFT OUTER JOIN Table2
ON Table1.PersonID = Table2.PersonID
AND Table2.Category = 'Foo'
WHERE
Table1.IDField = '12345'
Ответ 2
Попробуйте следующее:
LEFT OUTER JOIN
Table2 ON Table1.PesonID = Table2.PersonID
AND Table2.Category = 'Foo'
затем удалите строку "Foo" из предложения WHERE
Ответ 3
Проблема заключается не в соединении как таковом, а в требовании в предложении where, которое соответствует таблице2. Я решил это с помощью каменноугольной (table2.category, 'Foo') = 'Foo'. Таким образом, если таблица2 имеет значение null, она все равно будет соответствовать.