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

Oracle数据库:如何获取单一客户ID关联的双状态多账户数据

解决Oracle多状态账户客户的筛选问题

原SQL的问题

你写的WHERE条件(account_status_code = 350 and account_status_code = 450)逻辑矛盾——单条账户记录的状态码不可能同时等于两个不同值,这是导致无结果的核心原因。

最简实现SQL

方法1:子查询筛选目标客户ID

SELECT 
    a.account_number,
    c.client_id,
    a.account_status_code
FROM test_client c
JOIN test_client_account_relation r ON c.client_id = r.client_rltsn_id
JOIN test_account a ON r.client_account_id = a.account_id
WHERE c.client_id IN (
    -- 先筛选同时拥有350和450状态账户的客户ID
    SELECT r_inner.client_rltsn_id
    FROM test_client_account_relation r_inner
    JOIN test_account a_inner ON r_inner.client_account_id = a_inner.account_id
    WHERE a_inner.account_status_code IN (350, 450)
    GROUP BY r_inner.client_rltsn_id
    HAVING COUNT(DISTINCT a_inner.account_status_code) = 2
)
ORDER BY c.client_id, a.account_status_code;

方法2:窗口函数(适合大数据量场景)

SELECT 
    account_number,
    client_id,
    account_status_code
FROM (
    SELECT 
        a.account_number,
        c.client_id,
        a.account_status_code,
        -- 标记客户是否同时包含350和450
        MAX(CASE WHEN a.account_status_code = 350 THEN 1 ELSE 0 END) OVER (PARTITION BY c.client_id) AS has_350,
        MAX(CASE WHEN a.account_status_code = 450 THEN 1 ELSE 0 END) OVER (PARTITION BY c.client_id) AS has_450
    FROM test_client c
    JOIN test_client_account_relation r ON c.client_id = r.client_rltsn_id
    JOIN test_account a ON r.client_account_id = a.account_id
) t
WHERE has_350 = 1 AND has_450 = 1
ORDER BY client_id, account_status_code;

说明

  • 两种方法都先定位同时拥有350和450状态账户的客户ID,再查询这些客户的所有账户信息,完全匹配你的预期输出要求。
  • 方法1逻辑直观,适合中小数据量;方法2用窗口函数减少关联次数,性能更优,适合大数据量场景。

内容的提问来源于stack exchange,提问作者Node98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:58:25