SQL JOIN查询需仅显示一行:同user_id多数据关联去重问题咨询
解决关联查询重复行的问题
我来帮你搞定这个重复行的困扰!问题出在FL_Form_A1表中同一个user_id存在多条记录,当你用左连接关联时,每条FL_Form_A1的记录都会和FL_AmmendmentDetails的对应记录匹配,自然就输出了多行结果。下面给你几种实用的解决方案,你可以根据实际情况选择:
方案1:用DISTINCT快速去重
如果FL_Form_A1中同一user_id的两条记录所有字段值都完全相同,直接在查询开头加DISTINCT就能一键去除重复行:
SELECT DISTINCT FA.App_Name, FLA.ammendment_status, FA.App_Concern, FA.Respo_Mob, FLA.RegNo, FA.user_id FROM FL_AmmendmentDetails AS FLA LEFT JOIN FL_Form_A1 AS FA ON FA.user_id = FLA.user_id WHERE FLA.RegNo='FE19-2006329'
方案2:分组聚合取指定版本记录
如果同一user_id的FL_Form_A1记录有字段差异,但你只需要保留其中一个版本(比如取最新的、最大的字段值),可以用聚合函数配合分组实现:
SELECT MAX(FA.App_Name) AS App_Name, FLA.ammendment_status, MAX(FA.App_Concern) AS App_Concern, MAX(FA.Respo_Mob) AS Respo_Mob, FLA.RegNo, FA.user_id FROM FL_AmmendmentDetails AS FLA LEFT JOIN FL_Form_A1 AS FA ON FA.user_id = FLA.user_id WHERE FLA.RegNo='FE19-2006329' GROUP BY FLA.ammendment_status, FLA.RegNo, FA.user_id
注意:
GROUP BY后面必须包含所有没有用聚合函数包裹的字段。如果表中有时间字段(比如记录创建时间),可以把MAX()换成对应时间字段的聚合,确保取到最新的那条记录。
方案3:用窗口函数精准控制取行
如果需要精确指定取FL_Form_A1中同一user_id的某一行(比如第一条、最新一条),窗口函数ROW_NUMBER()是最灵活的选择:
WITH RankedFA AS ( SELECT *, -- 按user_id分组编号;如果有排序字段(比如create_time),可以替换(SELECT NULL)实现按规则排序 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY (SELECT NULL)) AS rn FROM FL_Form_A1 ) SELECT FA.App_Name, FLA.ammendment_status, FA.App_Concern, FA.Respo_Mob, FLA.RegNo, FA.user_id FROM FL_AmmendmentDetails AS FLA LEFT JOIN RankedFA AS FA ON FA.user_id = FLA.user_id AND FA.rn = 1 WHERE FLA.RegNo='FE19-2006329'
要是想取最新的记录,把
ORDER BY (SELECT NULL)改成ORDER BY create_time DESC即可,这样rn=1就对应最新的那条数据。
内容的提问来源于stack exchange,提问作者chethu
相关产品推荐
相关产品推荐

