Левое объединение не возвращает нулевые записи - PullRequest
0 голосов
/ 20 декабря 2018

Я имею дело с довольно простым SQL-запросом, но я не могу понять, почему несоответствующие записи не представлены нулевыми значениями в правой таблице.

У меня есть таблица A и таблица B с составнойключ и некоторые данные в таблице B, которые, как мне известно, не соответствуют ключу в таблице A. Однако набор результатов возвращает только строки с соответствующими ключами без несоответствующих (нулевых) записей.

SELECT *
FROM TableA a LEFT JOIN
     TableB b
     ON a.Field1 = b.Field1 AND
        a.Field2 = b.Field2    
WHERE b.Field1 IS NULL

Iожидал увидеть записи из таблицы A и те записи из таблицы B, которые не совпадают, чтобы быть представленными пустыми значениями.

РЕДАКТИРОВАТЬ ************************************************************

Ссылка с образцами данных и таблицами:

https://drive.google.com/file/d/1PNlyqO4mwMBOGgQnWVlduiDKaDjSaE8v/view?usp=sharing

Последняя запись в таблице B должнавидно, потому что значение для Field5 отличается от значения в TableA.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Проблема с вашей попыткой состоит в том, что вы начинаете с записей в TableA, а затем LEFT JOIN против TableB.Это заставляет движок только отображать записи из TableA, с дополнительными строками / столбцами из TableB, если они совпадают, но не записи из TableB, которые не включены в TableA.

Либо вы хотите изменить порядок соединения:

SELECT 
    *
FROM
    TableB b
    LEFT JOIN TableA a ON 
        a.Field1 = b.Field1 AND
        a.Field2 = b.Field2    
WHERE 
    a.Field1 IS NULL -- records from A table shouldn't exist

Или как RIGHT JOIN

SELECT 
    *
FROM TableA a RIGHT JOIN
     TableB b
     ON a.Field1 = b.Field1 AND
        a.Field2 = b.Field2    
WHERE a.Field1 IS NULL  -- records from A table shouldn't exist 

Или FULL JOIN, если вы хотите, чтобы записи из обоих отображались, дажеесли нет совпадений в другой таблице (без WHERE предложения):

SELECT 
    *
FROM TableA a FULL JOIN
     TableB b
     ON a.Field1 = b.Field1 AND
        a.Field2 = b.Field2    
0 голосов
/ 20 декабря 2018

Ваш SQL предполагает внутреннее соединение, когда вы помещаете пустую проверку в предложение where.Попробуйте это:

SELECT *
FROM TableA a LEFT JOIN
     TableB b
     ON a.Field1 = b.Field1 AND
        a.Field2 = b.Field2 AND
        B.Field1 is null and B.Field2 is null  <== Added.
...