无JOIN实现按关联文档数分类is_resident=N客户的SQL查询
查询需求说明
- 涉及两张业务表:
customers(客户表)、documents(文档表) - 表间匹配规则:
customers表的Id字段与documents表的cs_no字段为关联字段,cs_no字段允许存储重复值 - 字段规则:
customers表的is_resident字段为枚举值,仅可取Y或N - 语法限制:禁止使用JOIN语法
- 业务规则:仅统计
is_resident字段值为N的客户,按关联文档数做标记:- 客户ID在
documents.cs_no中仅出现1次(关联1份文档),标记为one document - 客户ID在
documents.cs_no中出现2次及以上(关联2份及以上文档),标记为some documents - 客户ID未在
documents.cs_no中出现(无关联文档),标记为no document
- 客户ID在
实现SQL
SELECT c.Id AS customer_id, CASE WHEN (SELECT COUNT(1) FROM documents WHERE cs_no = c.Id) = 1 THEN 'one document' WHEN (SELECT COUNT(1) FROM documents WHERE cs_no = c.Id) >= 2 THEN 'some documents' ELSE 'no document' END AS document_tag FROM customers c WHERE c.is_resident = 'N';
逻辑说明
- 整个语句未出现
JOIN关键字,完全符合语法限制要求 - 外层查询先通过
WHERE c.is_resident = 'N'过滤出所有需要统计的非居民客户 - 针对每一条符合条件的客户记录,通过标量子查询统计对应关联的文档总数,全程未使用表连接逻辑
- 通过
CASE分支对统计到的文档数做判断,返回对应的分类标签:- 统计值为1时返回单文档标记
- 统计值≥2时返回多文档标记
- 统计值为0(无匹配文档记录)时返回无文档标记
- 性能优化提示:如果表数据量较大,可以给
documents表的cs_no字段添加普通索引,大幅提升子查询的统计效率
内容的提问来源于stack exchange,提问作者deku
相关产品推荐
相关产品推荐

