如何在INNER JOIN查询中基于TABLE_A.LINK_ACCT_NO去重?
基于TABLE_A.LINK_ACCT_NO去重的SQL解决方案
你的核心需求是关联两张表后,基于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
相关产品推荐
相关产品推荐

