Выбор записей из 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

Другие вопросы по тегам