SQL双表关联查询时如何去除重复行 仅取单条匹配值
方案1:先对UL表按PARTY_ID分组去重后再关联
你可以先从UL表中给每个PARTY_ID筛选出唯一一条NAME记录,再和UC表做关联,即可避免重复行。如果仅要求任意取一条NAME,直接用MIN/MAX聚合函数即可,写法如下:
SELECT uc.*, ul.NAME FROM UC AS uc INNER JOIN ( SELECT PARTY_ID, MIN(NAME) AS NAME FROM UL GROUP BY PARTY_ID ) AS ul ON uc.PARTY_ID = ul.PARTY_ID WHERE uc.PID = '33322';
这里用MIN(NAME)会取字母序最小的NAME,换成MAX(NAME)就会取最大的,均满足“任意取一条”的需求,和你给出的预期输出结果完全匹配。
方案2:用窗口函数(支持MySQL 8.0+/PostgreSQL/Oracle等主流新版本数据库)
如果你需要更灵活的筛选规则(比如取UL表中ID最小的记录对应的NAME),可以用ROW_NUMBER窗口函数实现:
SELECT uc.*, ul.NAME FROM UC AS uc INNER JOIN ( SELECT PARTY_ID, NAME, ROW_NUMBER() OVER (PARTITION BY PARTY_ID ORDER BY ID) AS rn FROM UL ) AS ul ON uc.PARTY_ID = ul.PARTY_ID AND ul.rn = 1 WHERE uc.PID = '33322';
这里的ORDER BY ID是指定按UL表的ID升序排序,取每个PARTY_ID第一条记录的NAME,你可以调整排序规则来指定优先取哪一条,不指定排序规则也能拿到任意一条符合要求的结果。
方案3:用DISTINCT简化写法(仅当不需要指定取哪条NAME时)
如果完全不在乎取到的NAME是哪条,也可以直接在原查询基础上加DISTINCT实现去重:
SELECT DISTINCT uc.*, ul.NAME FROM UC AS uc INNER JOIN UL AS ul ON uc.PARTY_ID = ul.PARTY_ID WHERE uc.PID = '33322';
该写法仅在同一个PARTY_ID对应的UC行全部唯一时生效,你的场景下UC的PARTY_ID都是唯一的,所以也能得到去重后的结果。
内容的提问来源于stack exchange,提问作者user17516027
相关产品推荐
相关产品推荐

