Имейте в виду, что внешнее объединение SQL является своего рода реляционным объединением, которое специально разработано для проецирования нулевых значений. Если вы хотите избежать использования нулевого значения (на мой взгляд, это хорошо), вам следует избегать использования внешних объединений. Обратите внимание, что современные реляционные языки полностью обошлись без концепции нулевого и внешнего соединения.
Это внешнее соединение:
SELECT DISTINCT T1.id, T1.value, T2.other_value
FROM T1
LEFT OUTER JOIN T2
ON T1.id = T2.id;
… семантически эквивалентен этому коду SQL:
SELECT T1.id, T1.value, T2.other_value
FROM T1
INNER JOIN T2
ON T1.id = T2.id
UNION
SELECT T1.id, T1.value, NULL
FROM T1
WHERE NOT EXISTS (
SELECT *
FROM T2
WHERE T1.id = T2.id
);
Второй запрос может показаться сложным, но это только из-за того, как SQL был разработан / развит. Вышесказанное - это просто естественное соединение, союз и полусоединение. Однако в SQL нет оператора semi-join, он требует указывать списки столбцов в предложении SELECT
и писать предложения JOIN
, если в вашем продукте не реализован синтаксис NATURAL JOIN
стандартного SQL, что приводит к большому количеству кода для выражения. что-то довольно простое.
Таким образом, вы могли бы написать код, такой как второй запрос выше, но используя фактическое значение по умолчанию, а не нулевое значение.