关联表后使用NOT IN关键字筛选无发票客户的SQL查询需求
用NOT IN筛选无发票客户的SQL实现
哈喽,我来给你一步步拆解怎么实现这个需求哈!首先先明确已知的CUSTOMER表结构,创建语句如下:
CREATE TABLE CUSTOMER ( CUS_CODE NUMBER PRIMARY KEY, CUS_LNAME VARCHAR(15) NOT NULL, CUS_FNAME VARCHAR(15) NOT NULL, CUS_INITIAL CHAR(1), CUS_AREACODE CHAR(3) DEFAULT '615' NOT NULL CHECK(CUS_AREACODE IN ('615','713','931')), CUS_PHONE CHAR(8) NOT NULL, CUS_BALANCE NUMBER(9,2) DEFAULT 0.00 );
(注:我把你没写完的CUS_BAL...补全成了常见的客户余额字段格式,如果实际表结构有差异,你可以按需调整~)
接下来咱们分两步完成目标:
第一步:先找出所有有发票的客户编号
要拿到有发票的客户列表,我们需要用到发票表(这里假设表名为INVOICE,并且它包含外键CUS_CODE,用来关联CUSTOMER表的主键)。最简洁高效的方式是直接从发票表中提取去重后的客户编号:
SELECT DISTINCT CUS_CODE FROM INVOICE
如果你更习惯用表关联的写法,也可以这么写,结果是完全一致的:
SELECT DISTINCT c.CUS_CODE FROM CUSTOMER c JOIN INVOICE i ON c.CUS_CODE = i.CUS_CODE
第二步:用NOT IN筛选出无发票的客户
把上面的子查询放到主查询的NOT IN条件里,就能精准筛选出从未产生过任何发票的客户了:
SELECT * FROM CUSTOMER WHERE CUS_CODE NOT IN ( SELECT DISTINCT CUS_CODE FROM INVOICE );
小提醒
- 一定要加
DISTINCT哦!因为同一个客户可能有多张发票,去重后能让子查询的结果更简洁,还能提升整体查询效率。 - 如果INVOICE表中存在
CUS_CODE为NULL的记录,NOT IN可能会返回空结果(因为NULL和任何值比较都返回UNKNOWN),这时候可以在子查询里加上过滤条件来规避:
SELECT * FROM CUSTOMER WHERE CUS_CODE NOT IN ( SELECT DISTINCT CUS_CODE FROM INVOICE WHERE CUS_CODE IS NOT NULL );
内容的提问来源于stack exchange,提问作者Boognish
相关产品推荐
相关产品推荐

