SQL查找多行重复项

时间:2010-09-23 00:03:47

标签: sql database-design

在我的工作中,我们将数据存储在数据库中,数据未规范化。我正在寻找一种方法来查找重复的数据。

我们的数据库有3行列,名称,状态,策略

此数据可能如下所示:

OldTable:
Name | State | Strat
-----+-------+------
A    | M     | 1
A    | X     | 3
B    | T     | 6
C    | M     | 1
C    | X     | 3
D    | X     | 3

我想要做的是将数据移动到两个表中,一个包含名称,另一个包含State和Strats的集合,所以它看起来更像是

NewTable0:
Name | StratID
-----+--------
A    | 1
B    | 2
C    | 1
D    | 3

NewTable1:
StratID | State | Strat
--------+-------+------
1       | M     | 1    
1       | X     | 3
2       | T     | 6
3       | X     | 3

因此在数据示例中,A和C将是重复的,但D不会。我将如何寻找和/或识别这些副本?

2 个答案:

答案 0 :(得分:1)

您可以通过将名称分组在一起来找到这一点,并且只列出有多个记录的那些:

SELECT OldTable.Name, COUNT(1) Duplicates
FROM OldTable
GROUP BY OldTable.Name
HAVING Duplicates > 1

应输出:

OldTable:
Name | Duplicates
-----+------------
A    | 2
C    | 2

答案 1 :(得分:1)

尝试:

SELECT OT1.Name Name1, OT2.Name Name2
FROM OldTable OT1
JOIN OldTable OT2 ON OT1.Name < OT2.Name AND 
                     OT1.State = OT2.State AND 
                     OT1.Strat = OT2.Strat
GROUP BY OT1.Name, OT2.Name 
HAVING COUNT(*) = (SELECT COUNT(*) FROM OldTable TC1 WHERE TC1.NAME = OT1.NAME) 
   AND COUNT(*) = (SELECT COUNT(*) FROM OldTable TC2 WHERE TC2.NAME = OT2.NAME)