首页 > 解决方案 > 选择不在集合中的不同记录

问题描述

我有一张客户表,上面有他们的客户联系方式。

可以通过以下三种方式之一联系客户:

FK id 在括号中。

如果我想为 SMS 和电子邮件提取不同客户 ID 的列表,我可以执行以下操作:

SELECT DISTINCT customer_id 
FROM contact_options 
WHERE contact_option_type_id IN (2,3)

但是我该如何做相反的事情呢?假设我想要一个 ( DISTINCT) 没有电话联系人的客户列表。我可以在不使用子查询的情况下做到这一点吗?

我意识到这个例子是人为的,实际上我有很多不同的联系方式(大约 80 个)。

标签: sqlpostgresql

解决方案


一种选择是使用聚合:

SELECT customer_id
FROM contact_options
GROUP BY customer_id
HAVING SUM(CASE WHEN contact_option_type_id = 1 THEN 1 ELSE 0 END) = 0;

我们也可以尝试使用EXISTS

SELECT DISTINCT customer_id
FROM contact_options c1
WHERE NOT EXISTS (SELECT 1 FROM contact_options c2
    WHERE c1.customer_id = c2.customer_id AND c2.contact_option_type_id = 1);

推荐阅读