求助:SQL查询需保留重复记录且不使用DISTINCT的解决方案
保留所有记录的前提下处理SQL重复姓名与身份证号问题
问题场景
当前使用的SQL查询:
select UserTableID as [ID], Ad_Soyad AS [NAME SURNAME], Kimlik_No AS [IDENTIFICATION NUMBER] from SA_OtelRezervasyon
返回结果中,存在NAME SURNAME和IDENTIFICATION NUMBER完全相同但ID不同的重复记录:
ID NAME SURNAME IDENTIFICATION NUMBER 1 Ali AKYÜZ 11111111111 2 Osman 22222222222 3 Ali AKYÜZ 11111111111 4 Mustafa Batuhan 33333333333
由于中间件依赖ID(UserTableID)填充数据,无法使用DISTINCT(会过滤掉部分ID记录),需要保留所有记录的同时处理重复问题。
解决方案
1. 标记重复项(保留所有记录)
用ROW_NUMBER()窗口函数按姓名和身份证号分组,给每组内的记录编号,轻松区分重复条目:
select UserTableID as [ID], Ad_Soyad AS [NAME SURNAME], Kimlik_No AS [IDENTIFICATION NUMBER], ROW_NUMBER() OVER(PARTITION BY Ad_Soyad, Kimlik_No ORDER BY UserTableID) as [Duplicate_Index] from SA_OtelRezervasyon
返回结果示例:
ID NAME SURNAME IDENTIFICATION NUMBER Duplicate_Index 1 Ali AKYÜZ 11111111111 1 3 Ali AKYÜZ 11111111111 2 2 Osman 22222222222 1 4 Mustafa Batuhan 33333333333 1
Duplicate_Index为1的是每组第一条记录,大于1的就是重复项。
2. 避免重复显示姓名/身份证号(仍保留所有ID)
如果需要前端不重复展示姓名和身份证号,但中间件必须拿到所有ID,用CASE结合窗口函数实现:
select UserTableID as [ID], CASE WHEN ROW_NUMBER() OVER(PARTITION BY Ad_Soyad, Kimlik_No ORDER BY UserTableID) = 1 THEN Ad_Soyad ELSE NULL END AS [NAME SURNAME], CASE WHEN ROW_NUMBER() OVER(PARTITION BY Ad_Soyad, Kimlik_No ORDER BY UserTableID) = 1 THEN Kimlik_No ELSE NULL END AS [IDENTIFICATION NUMBER] from SA_OtelRezervasyon order by UserTableID
返回结果示例:
ID NAME SURNAME IDENTIFICATION NUMBER 1 Ali AKYÜZ 11111111111 2 Osman 22222222222 3 NULL NULL 4 Mustafa Batuhan 33333333333
3. 关联主记录ID(追踪重复来源)
如果需要知道每条重复记录对应的同组主记录(比如最小ID的条目),用自关联查询:
select t1.UserTableID as [ID], t1.Ad_Soyad AS [NAME SURNAME], t1.Kimlik_No AS [IDENTIFICATION NUMBER], t2.Min_ID as [Master_Record_ID] from SA_OtelRezervasyon t1 inner join ( select Ad_Soyad, Kimlik_No, MIN(UserTableID) as Min_ID from SA_OtelRezervasyon group by Ad_Soyad, Kimlik_No ) t2 on t1.Ad_Soyad = t2.Ad_Soyad and t1.Kimlik_No = t2.Kimlik_No
返回结果示例:
ID NAME SURNAME IDENTIFICATION NUMBER Master_Record_ID 1 Ali AKYÜZ 11111111111 1 3 Ali AKYÜZ 11111111111 1 2 Osman 22222222222 2 4 Mustafa Batuhan 33333333333 4
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

