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

如何通过嵌套查询或表连接将多行条件聚合为单条结果?

解决客户表与访问表一对多关系下的状态聚合问题

针对客户表(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:33:28