查找和删除SQL Server行中的重复列值

时间:2012-07-31 10:08:58

标签: sql-server tsql sql-server-2008-r2 duplicates

是的,另一个SQL重复问题:)

我有一个包含多个phone number列的SQL Server 2008 R2表,如下所示:

ID   Tel1   Tel2   Tel3   Tel4   Tel5   Tel6
 1    123    456    789   NULL   NULL   NULL
 2    123    456    123    123   NULL   NULL
 3    456    789    123    456   NULL   NULL

我想从每一行中删除重复的电话号码 - 例如,在行ID 2中,我需要NULL Tel3和Tel4,而在第3行我需要NULL Tel4。我不需要检查行之间的重复 - 在多行之间可以存在相同的电话号码,而不是在同一行的不同列中。

有人能建议摆脱这些重复的最佳方法吗?

3 个答案:

答案 0 :(得分:2)

Sql Fiddle here

update PhoneNumbers
   set Tel2 = case when Tel1 = Tel2 
                   then null 
                   else Tel2 end,
       Tel3 = case when Tel3 in (Tel1, Tel2) 
                   then null 
                   else Tel3 end,
       Tel4 = case when Tel4 in (Tel1, Tel2, Tel3) 
                   then null 
                   else Tel4 end,
       Tel5 = case when Tel5 in (Tel1, Tel2, Tel3, Tel4) 
                   then null 
                   else Tel5 end,
       Tel6 = case when Tel6 in (Tel1, Tel2, Tel3, Tel4, Tel5) 
                   then null 
                   else Tel6 end

答案 1 :(得分:1)

您可以使用UNPIVOT ...

找到它们
select id, telNo 
from phonenumbertable
unpivot 
( telNo for tel in (tel1, tel2, tel3, tel4,tel5, tel6)) as u    
group by id,telno
having COUNT(telno)>1

答案 2 :(得分:1)

一种可能的方法是像这样更新它:

update tablename
set Tel6 = null
where Tel6 = Tel5 or Tel6 = Tel4 or Tel6 = Tel3 or Tel6 = Tel3 or Tel6 = Tel2 or Tel6 = Tel1

然后对其他列(第一个除外)执行相同的更新(在where子句中进行较少的比较)。