从1表中选择不会出现在另一个表中的记录

时间:2015-08-14 21:01:58

标签: sql-server tsql join right-join

我希望有人可以帮我解决这个问题。 我有一个客户表 - 让我们称之为表C.我有第二个客户表,不能被称为 - 我们称之为表D.

我想从表C中提取所有需要的信息(姓名,地址,电话等),除非客户出现在表D中。

在下面显示的示例中,我希望为除John Doe(ID:1)和Fred Savage(ID:5)之外的所有客户返回数据

Data Example

我认为RIGHT OUTER JOIN可能适用于此处,但我之前没有使用过这种类型的联接。

4 个答案:

答案 0 :(得分:2)

使用NOT EXISTS执行此操作:

SELECT c.*
FROM tableC c
WHERE NOT EXISTS (
        SELECT *
        FROM tableD d
        WHERE c.customerID = d.customerid
        );

答案 1 :(得分:2)

如果你想使用一个连接,那么它就是你想要的左连接,在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值),因为我认为这些更清楚地传达了意图。

答案 2 :(得分:1)

Select * from table.c where customer_id not in (select distinct customer_id from table.d);

答案 3 :(得分:-1)

是的,你想要一个外部联接。 试试这个:https://technet.microsoft.com/en-US/library/ms187518(v=SQL.105).aspx