Выбор записей из 1 таблицы, которые не отображаются в другой таблице
Я надеюсь, что кто-то сможет мне помочь с этой проблемой, с которой я столкнулся. У меня есть таблица клиентов - давайте назовем ее таблицей C. И у меня есть вторая таблица клиентов, которую нельзя называть - назовем ее таблицей D.
Я хотел бы извлечь всю необходимую информацию (имя, адрес, телефон и т. Д.) Из таблицы C, если только клиент не появится в таблице D.
В приведенном ниже примере я хотел бы, чтобы данные возвращались для всех клиентов, кроме Джона Доу (ID: 1) и Фреда Сэвиджа (ID: 5)
Я думаю RIGHT OUTER JOIN
может быть применимо здесь, но я не использовал этот тип соединения ранее.
4 ответа
Использование NOT EXISTS
сделать это:
SELECT c.*
FROM tableC c
WHERE NOT EXISTS (
SELECT *
FROM tableD d
WHERE c.customerID = d.customerid
);
Если вы хотите использовать объединение, тогда вам нужно левое объединение с фильтром для нулевых значений в таблице d. Правильное объединение получило бы все строки из таблицы d, а также соответствующие строки из таблицы c, что совершенно противоположно тому, что вы хотите, но если бы вы переключили таблицы, вы бы получили тот же результат, поэтому этот:
select c.* from c
left join d on c.CustomerID = d.CustomerID
where d.CustomerID is null
эквивалентно:
select c.* from d
right join c on c.CustomerID = d.CustomerID
where d.CustomerID is null;
Лично я предпочел бы использовать либо коррелированную not exists
запрос или not in
(но остерегайтесь null
ценности), как я думаю, те передают намерение более четко.
Select * from table.c where customer_id not in (select distinct customer_id from table.d);
Да, вы хотите внешнее соединение. Попробуйте это: https://technet.microsoft.com/en-US/library/ms187518(v=SQL.105).aspx