SQL多表关联去重:同一organization_id的重复组织名称仅返回一条
解决重复返回同一组织记录的SQL方案
核心问题是:organization表的一条记录,在organization_relation表中存在多个符合WHERE条件的org_type_cd,导致关联查询后重复返回主表记录。DISTINCT失效是因为它会对整行(包含不同的org_type_cd)去重,无法满足需求。以下是几种可行的解决方法:
方法一:仅返回主表记录(不需要org_type_cd)
如果不需要输出org_type_cd字段,直接通过EXISTS判断组织是否存在符合条件的关联记录即可,确保主表记录唯一:
SELECT O.ORGANIZATION_ID, O.ACTIVE_IND, O.ORG_NAME FROM ORGANIZATION O WHERE EXISTS ( SELECT 1 FROM ORGANIZATION_RELATION T WHERE T.ORGANIZATION_ID = O.ORGANIZATION_ID AND T.ORG_TYPE_CD IN (2581973089.00, 2576962393.00) )
方法二:保留org_type_cd并返回唯一组织记录(取指定类型)
如果需要保留org_type_cd字段,可使用窗口函数ROW_NUMBER()给每个组织的关联记录编号,筛选出第一条:
SELECT ORGANIZATION_ID, ACTIVE_IND, ORG_NAME, ORG_TYPE_CD FROM ( SELECT O.ORGANIZATION_ID, O.ACTIVE_IND, O.ORG_NAME, T.ORG_TYPE_CD, -- 按组织ID分组,按类型码排序取第一条,可根据需求调整ORDER BY规则 ROW_NUMBER() OVER (PARTITION BY O.ORGANIZATION_ID ORDER BY T.ORG_TYPE_CD) AS rn FROM ORGANIZATION O INNER JOIN ORGANIZATION_RELATION T ON T.ORGANIZATION_ID = O.ORGANIZATION_ID WHERE T.ORG_TYPE_CD IN (2581973089.00, 2576962393.00) ) AS sub_query WHERE rn = 1
方法三:通过聚合函数保留单个org_type_cd
使用GROUP BY按主表唯一字段分组,对org_type_cd做聚合(如取最小/最大值),确保每个组织仅返回一行:
SELECT O.ORGANIZATION_ID, O.ACTIVE_IND, O.ORG_NAME, MIN(T.ORG_TYPE_CD) AS ORG_TYPE_CD -- 可替换为MAX(),根据需求选择 FROM ORGANIZATION O INNER JOIN ORGANIZATION_RELATION T ON T.ORGANIZATION_ID = O.ORGANIZATION_ID WHERE T.ORG_TYPE_CD IN (2581973089.00, 2576962393.00) GROUP BY O.ORGANIZATION_ID, O.ACTIVE_IND, O.ORG_NAME
内容的提问来源于stack exchange,提问作者Chethan
相关产品推荐
相关产品推荐

