Предложение SQL Server LEFT JOIN и WHERE

Вот мой код

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND Table2.IsDefault = 1

Проблема возникает, когда Table2 имеет значение null, поэтому запрос ничего не возвращает.

Как оставить последнюю часть запроса AND Table2.IsDefault = 1 опционально?

Я попытался выполнить короткое замыкание запроса с помощью OR но я обнаружил, что он работает иначе, чем С#

Ответы

Ответ 1

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12

Ответ 2

 AND COALESCE(Table2.IsDefault,1) = 1

Читая комментарии, похоже, ваше лучшее решение - это перевести условие на соединение:

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12 

Поскольку это соединение OUTER, вы все равно сохраните любую информацию Table1, если совпадение не получится, и с учетом утверждения, что "Таблица2 всегда будет возвращать 1 запись", вы не рискуете фильтровать дополнительные результаты соединения, переместив условие. Вы получите те же результаты, что и размещение условия в предложении WHERE.

Причиной перемещения кониции в предложение ON является то, что COALESCE(), ISNULL() и OR все это вызывает проблемы для индексов. С условием в предложении ON нам не нужно ни одного из них, и поэтому он должен получить лучший план выполнения.

Ответ 3

Попробуй это:

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND isnull(Table2.IsDefault,1) = 1

Вы были почти там :-)

Ответ 4

SELECT ID, Name, Phone FROM Table1 
  LEFT JOIN Table2 ON Table1.ID = Table2.ID
  WHERE Table1.ID = 12 
    AND (Table2.IsDefault IS NULL OR Table2.IsDefault = 1);

Ответ 5

Используйте подзапрос, чтобы фильтровать результаты таблицы 2, прежде чем они будут объединены с таблицей 1:

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN (SELECT * FROM Table2 WHERE IsDefault = 1) AS Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12