You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关联表后使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:49:19