2016-06-28 3 views
1

Я хочу выбрать данные из таблицы A, которая не соответствует следующему запросу. Другими словами, я хочу все из таблицы A, за исключением следующих записей. Я предполагаю, что он левый, но я получаю намного больше матчей, чем ожидалось.SQL Left Outer Join vs Inner Join Не равен

SELECT distinct 
    a.Address_Direction, 
    a.Address_Extension, 
    a.Address_Number, 
    a.Address_Root, 
    a. PHY_ADDR1, 
    b.PHY_ADDR1 
FROM [RD_GeoCode].[dbo].[PA_Stg_Test2] AS a 
inner JOIN [RD_GeoCode].[dbo].[rg_ApplicationData_AllForms_20160401_address] AS b ON 
B.address_direction = a.address_direction 
and B.address_root = a.address_root 
and B.address_number = a.address_number 
and B.Address_Extension = a.Address_Extension 
and b.PHY_ZIPCD = a.PHY_ZIPCD 

ответ

2

Используйте левую присоединиться и добавить Where B.AnyField Is Null Как отметил, B.AnyField должен быть столбец без Nulls как первичный ключ, иначе вы получите ложных срабатываний.

Также убедитесь, что ваше условие соединения не позволяет дублировать, так как это приведет к отключению ваших номеров.

+1

Чтобы добавить к этому: убедитесь, что выбранный «AnyField» не может быть пустым, если есть совпадение; обычно путем выбора поля первичного ключа или другого столбца, определенного как NOT NULL. – Uueerdo

+0

У меня есть 293K строк в таблице A, 7 миллионов в таблице B. Внутреннее соединение соответствует 233k. Но этот поиск привел к более чем 300 тыс. Я просто хочу посмотреть оставшиеся 60 тыс. – ObiWanCannoli

+0

Поле, которое вы используете из таблицы B, должно иметь нулевые значения. См. Мой обновленный ответ. Если этот столбец в B не имеет нулей, невозможно получить больше, чем 60k, которые вы после. –

0

Наряду с левым соединением вы должны проверить, соответствуют ли соответствующие записи из B. Попробуйте выполнить следующий запрос:

SELECT distinct a.Address_Direction, a.Address_Extension, a.Address_Number, a.Address_Root, a. PHY_ADDR1, b.PHY_ADDR1 
FROM [RD_GeoCode].[dbo].[PA_Stg_Test2] AS a 
LEFT JOIN [RD_GeoCode].[dbo].[rg_ApplicationData_AllForms_20160401_address] AS b ON 
B.address_direction = a.address_direction 
AND B.address_root = a.address_root 
AND B.address_number = a.address_number 
AND B.Address_Extension = a.Address_Extension 
AND b.PHY_ZIPCD = a.PHY_ZIPCD 
WHERE B.address_number IS NULL