如何通过嵌套查询或表连接将多行条件聚合为单条结果?
解决客户表与访问表一对多关系下的状态聚合问题
针对客户表(CUSTOMERS_TABLE)和访问表(VISITS_TABLE)的一对多关系,要实现只要客户存在任意一条状态为ACTIVE或PENDING的访问记录,客户状态即为ACTIVE,否则为INACTIVE,同时避免因关联产生重复客户行,可采用以下两种方案:
方案1:使用EXISTS子查询(性能最优)
通过EXISTS做存在性判断,只要找到符合条件的访问记录就停止检索,天然保证每个客户仅返回一行结果。
SELECT c.owner_id, c.pet_id, c.name, c.address, CASE WHEN EXISTS ( SELECT 1 FROM VISITS_TABLE v WHERE v.owner_id = c.owner_id AND v.pet_id = c.pet_id AND v.status IN ('ACTIVE', 'PENDING') ) THEN 'ACTIVE' ELSE 'INACTIVE' END AS status FROM CUSTOMERS_TABLE c
方案2:使用GROUP BY+聚合函数
先关联两张表,再通过GROUP BY将同一客户的多条访问记录合并为一行,利用MAX函数优先保留优先级更高的状态值。
SELECT c.owner_id, c.pet_id, c.name, c.address, MAX(CASE WHEN v.status IN ('ACTIVE', 'PENDING') THEN 'ACTIVE' ELSE 'INACTIVE' END) AS status FROM CUSTOMERS_TABLE c LEFT JOIN VISITS_TABLE v ON c.owner_id = v.owner_id AND c.pet_id = v.pet_id GROUP BY c.owner_id, c.pet_id, c.name, c.address
说明
- 方案1更适合仅需存在性判断的场景,执行效率更高;
- 方案2可扩展用于需要同时处理其他聚合逻辑(如统计访问次数)的场景;
- 两种方案均能避免重复行,且严格符合“有ACTIVE/PENDING则客户状态为ACTIVE,否则为INACTIVE”的需求。
内容的提问来源于stack exchange,提问作者imagayfurryxd
相关产品推荐
相关产品推荐

