Как правильно написать эксклюзивное левое соединение для двух таблиц? - PullRequest
0 голосов
/ 01 июля 2019

Нужно ли писать условие 'NULL' для двух (или может быть больше) ключей при выполнении эксклюзивного соединения двух таблиц слева?Вопрос в том, достаточно ли 'WHERE B.columnName1 IS NULL'?

Присоединиться с одним ключевым условием:

SELECT columns
FROM TableA
LEFT OUTER JOIN TableB
ON A.columnName = B.columnName
WHERE B.columnName IS NULL

Является ли следующее более точным?Нужно ли условие для columnName2?

SELECT columns
FROM TableA
LEFT OUTER JOIN TableB
ON A.columnName1 = B.columnName1
AND  A.columnName2 = B.columnName2
WHERE B.columnName1 IS NULL 
AND B.columnName2 IS NULL 

Пока это работало с одним условием, но я только запутался, я вижу, что это простой вопрос, извините за это

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Достаточно одного столбца (если он не обнуляем):

SELECT columns
FROM TableA A
LEFT OUTER JOIN TableB B
  ON A.columnName = B.columnName
WHERE B.columnName IS NULL;

Рекомендуется использовать первичный ключ для таблицы B

0 голосов
/ 01 июля 2019

Рекомендуется использовать столбец, являющийся частью предложения ON, который выполняет ваш код:

SELECT columns
FROM TableA A LEFT OUTER JOIN 
     TableB B
     ON A.columnName = B.columnName
WHERE B.columnName IS NULL;

JOIN не обрабатывает значения NULL как равные.Точно так же первичный ключ (или любой компонент первичного ключа) также работает нормально.

Если вы не хотите думать об этом, используйте NOT EXISTS:

SELECT columns
FROM TableA A 
WHERE NOT EXISTS (SELECT 1
                  FROM TableB B
                  WHERE A.columnName = B.columnName
                 );
0 голосов
/ 01 июля 2019

Предложение ON содержит условие для объединения:

ON A.columnName = B.columnName

Если это условие не выполняется, то результатом является то, что все столбцы несопоставленной строки таблицы B будут NULL, поэтому ваш второй запрос не ошибается. Но , это также означает, что само B.columnName равно NULL, и этого условия только в предложении WHERE достаточно.Это просто означает, что в этой строке A.columnName не имеет соответствия B.columnName.

...