Ответ 1
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
Вот мой код
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
но я обнаружил, что он работает иначе, чем С#
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
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 нам не нужно ни одного из них, и поэтому он должен получить лучший план выполнения.
Попробуй это:
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND isnull(Table2.IsDefault,1) = 1
Вы были почти там :-)
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);
Используйте подзапрос, чтобы фильтровать результаты таблицы 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