如何识别表中的重复行

时间:2018-06-10 23:47:08

标签: sql sql-server

我有一个表4列code1,code2,code3和code4

所以那些可以包含如下数据(显示以下2条记录)

code1=xy code2=yz code3='' code4=''
code1=xy code2='' code3=yz code4=''

我们需要将2记录作为重复记录,因为它包含分散在不同列上的相同数据。请帮帮我

3 个答案:

答案 0 :(得分:0)

你在这里所拥有的是一个多对一的关系,有人将这种关系变成了一个单独的表,这会产生比它解决的问题更多的问题。

我建议您修改架构,然后您就能更轻松地解决此类问题。

例如,如果列code1,code2,code3和code4在employee表上,如下所示:

employee table
|employeeid |name |code1 |code2 |code3 |code4 |
|1          |bob  |xy    |yz    |      |      |
|2          |sam  |xy    |      |yz    |      |

然后,您可以将数据重组为两个表:

employee table
|employeeid |name |
|1          |bob  |
|2          |sam  |

code table
|employeeid |code |
|1          |xy   |
|1          |yz   |
|2          |xy   |
|2          |yz   |

这样可以更容易地找到具有相同代码的人(并删除可能有四个代码的任意限制)

答案 1 :(得分:0)

如果您不关心列的排序,可以通过以下方式获取唯一值:

select distinct x.*
from t cross apply
     (select max(case when seqnum = 1 then col end) as col1,
             max(case when seqnum = 2 then col end) as col2,
             max(case when seqnum = 3 then col end) as col3,
             max(case when seqnum = 4 then col end) as col4
      from (select col, row_number() over (order by col desc) as seqnum
            from (values (col1), (col2), (col3), (col4)) v(col)
           ) x
     ) x

答案 2 :(得分:0)

您可以使用此功能查找重复值

Detect duplicate items in recursive CTE

WITH cte AS (
SELECT ROW_NUMBER()OVER(PARTITION BY [FieldName] ORDER BY [FieldName])[Rank],* 
FROM TableName)
SELECT * 
FROM  cte 
WHERE cte.[Rank]>1