我希望有人可以帮助我解决我遇到的这个问题。我有一张客户表——我们称之为 C 表。我还有第二张不被调用的客户表——我们称之为 D 表。
我想从表 C 中提取所有需要的信息(姓名、地址、电话等),除非客户出现在表 D 中。
在下面显示的示例中,我希望返回除 John Doe (ID: 1) 和 Fred Savage (ID: 5) 之外的所有客户的数据
我认为 aRIGHT OUTER JOIN
可能适用于此,但我之前没有使用过这种类型的连接。
我希望有人可以帮助我解决我遇到的这个问题。我有一张客户表——我们称之为 C 表。我还有第二张不被调用的客户表——我们称之为 D 表。
我想从表 C 中提取所有需要的信息(姓名、地址、电话等),除非客户出现在表 D 中。
在下面显示的示例中,我希望返回除 John Doe (ID: 1) 和 Fred Savage (ID: 5) 之外的所有客户的数据
我认为 aRIGHT OUTER JOIN
可能适用于此,但我之前没有使用过这种类型的连接。
如果您想使用连接,那么它是您想要的左连接,并带有 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
值),因为我认为这些更清楚地传达了意图。
用于NOT EXISTS
执行此操作:
SELECT c.*
FROM tableC c
WHERE NOT EXISTS (
SELECT *
FROM tableD d
WHERE c.customerID = d.customerid
);
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