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

如何在INNER JOIN查询中基于TABLE_A.LINK_ACCT_NO去重?

你的核心需求是关联两张表后,基于TABLE_A.LINK_ACCT_NO去除重复行,同时避开DISTINCT和全列GROUP BY的限制。以下是两种可行方案:

方案1:使用窗口函数(推荐)

利用ROW_NUMBER()窗口函数按LINK_ACCT_NO分组,为每组内的行编号,仅保留每组第一行。该方法简洁灵活,支持绝大多数现代数据库(如PostgreSQL、MySQL 8.0+、SQL Server等)。

SELECT 
    LINK_ACCT_NO, 
    E_DEN_SUPER_USER, 
    E_DEN_NAME,  
    E_DEN_ACCT_NO,  
    E_DEN_Test_NM, 
    E_DEN_CURR, 
    E_DEN_CD, 
    E_DEN_Test_CD
FROM (
    SELECT 
        TABLE_A.LINK_ACCT_NO, 
        TABLE_B.E_DEN_SUPER_USER, 
        TABLE_B.E_DEN_NAME,  
        TABLE_B.E_DEN_ACCT_NO,  
        TABLE_B.E_DEN_Test_NM, 
        TABLE_B.E_DEN_CURR, 
        TABLE_B.E_DEN_CD, 
        TABLE_B.E_DEN_Test_CD,
        -- 按LINK_ACCT_NO分组并编号,排序规则可按需调整(比如取最新/特定优先级的行)
        ROW_NUMBER() OVER (PARTITION BY TABLE_A.LINK_ACCT_NO ORDER BY TABLE_B.E_DEN_SUPER_USER) AS row_num
    FROM TABLE_B 
    JOIN TABLE_A ON TABLE_A.LINK_USER_ID = TABLE_B.E_DEN_SUPER_USER
    WHERE TABLE_A.LINK_ACCT_STATUS = '00' 
      AND E_DEN_SUPER_USER > 1000 
      AND E_DEN_STATUS = 'A' 
      AND E_DEN_Test_CD IS NOT NULL 
      AND E_DEN_Test_NM IS NOT NULL 
      AND E_DEN_NAME IS NOT NULL 
      AND E_DEN_ACCT_NO IS NOT NULL
      AND TABLE_A.LINK_ACCT_NO LIKE '_____________' 
) AS filtered_data
WHERE row_num = 1;

说明

  • PARTITION BY TABLE_A.LINK_ACCT_NO:将结果按LINK_ACCT_NO分组,是实现去重的核心逻辑。
  • ORDER BY TABLE_B.E_DEN_SUPER_USER:定义每组内的排序规则,决定保留哪一行(可替换为ORDER BY TABLE_B.E_DEN_ACCT_NO DESC取最新账号等)。
  • WHERE row_num = 1:仅保留每组第一行,确保每个LINK_ACCT_NO只返回一条数据。

方案2:关联子查询(兼容老版本数据库)

如果你的数据库不支持窗口函数(如MySQL 5.7及以下),可以用关联子查询筛选每个LINK_ACCT_NO对应的目标行。

SELECT 
    TABLE_A.LINK_ACCT_NO, 
    TABLE_B.E_DEN_SUPER_USER, 
    TABLE_B.E_DEN_NAME,  
    TABLE_B.E_DEN_ACCT_NO,  
    TABLE_B.E_DEN_Test_NM, 
    TABLE_B.E_DEN_CURR, 
    TABLE_B.E_DEN_CD, 
    TABLE_B.E_DEN_Test_CD
FROM TABLE_B 
JOIN TABLE_A ON TABLE_A.LINK_USER_ID = TABLE_B.E_DEN_SUPER_USER
WHERE TABLE_A.LINK_ACCT_STATUS = '00' 
  AND E_DEN_SUPER_USER > 1000 
  AND E_DEN_STATUS = 'A' 
  AND E_DEN_Test_CD IS NOT NULL 
  AND E_DEN_Test_NM IS NOT NULL 
  AND E_DEN_NAME IS NOT NULL 
  AND E_DEN_ACCT_NO IS NOT NULL
  AND TABLE_A.LINK_ACCT_NO LIKE '_____________'
  -- 子查询找到当前LINK_ACCT_NO对应的最小E_DEN_SUPER_USER,确保仅返回一行
  AND TABLE_B.E_DEN_SUPER_USER = (
      SELECT MIN(tb.E_DEN_SUPER_USER)
      FROM TABLE_B tb
      JOIN TABLE_A ta ON ta.LINK_USER_ID = tb.E_DEN_SUPER_USER
      WHERE ta.LINK_ACCT_NO = TABLE_A.LINK_ACCT_NO
        AND ta.LINK_ACCT_STATUS = '00' 
        AND tb.E_DEN_SUPER_USER > 1000 
        AND tb.E_DEN_STATUS = 'A' 
        AND tb.E_DEN_Test_CD IS NOT NULL 
        AND tb.E_DEN_Test_NM IS NOT NULL 
        AND tb.E_DEN_NAME IS NOT NULL 
        AND tb.E_DEN_ACCT_NO IS NOT NULL
  );

说明

  • 子查询针对每个LINK_ACCT_NO,找到符合条件的E_DEN_SUPER_USER最小值(也可换成MAX()或其他聚合逻辑)。
  • 主查询仅保留与子查询结果匹配的行,实现每个LINK_ACCT_NO只返回一条数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:08:28