3

我有一个带有复合主键(a,b)的表。我在临时表中进行了备份,但有些重复记录是如何出现的。现在无法将备份记录移动到主表。

请建议一些方法来删除基于 2 列的临时表中的重复项。表是 oracle 表,有 7000 万条记录,大约 400 万个重复项

4

3 回答 3

2

你有两个选择:

  1. 在复制它们之前删除源表中的重复项
  2. 首先不要复制重复项。

第二个效率更高,可以使用以下语句完成:

INSERT INTO target_table (a,b,c,d,e,f)
SELECT a,b,max(c),max(d),max(e),max(f)
FROM source_table
GROUP BY a,b;

作为替代方案(例如,当某些列被定义为CLOBorLONG并且您不能对它们应用 max() 时):

INSERT INTO target_table (a,b,c,d,e,f)
SELECT a,b,c,d,e,f
FROM (
    SELECT a,b,c,d,e,f,
           row_number() over (partition by a,b) as rn
    FROM source_table
) 
WHERE rn = 1;

如果您确实想首先删除行,可以使用以下语句执行此操作:

DELETE FROM source_table
WHERE rowid NOT IN (SELECT min(rowid)
                    FROM source_table
                    GROUP BY a,b
                    HAVING count(*) > 1)
于 2012-05-09T14:07:27.017 回答
1
  1. orafaq中列出了 3 种方法

  2. 消除重复记录的最简单方法是 SELECT DISTINCT 到临时表中,截断原始表并将记录选择回原始表中。详情在这里

  3. 这个适用于 MSSQL Server,但我想同样的原则也适用于你的情况。

于 2012-05-09T14:15:17.487 回答
0

说我有类似的数据


1   user1   1
2   user1   1
3   user1   1
4   user1   3
5   user1   9
6   user2   1
7   user2   1
8   user2   10
9   user3   97

这里user1(3)和user2(1)有重复记录。

此查询将仅显示重复案例中的那些记录因此而不是 user1 的 3 条记录,它仅显示 2


 SELECT BT.NAME, BT.LOCATION
   FROM SO_BUFFER_TABLE_7 BT,
        (SELECT BT.NAME, BT.LOCATION, MAX(ROWID) AS UNQ
           FROM SO_BUFFER_TABLE_7 BT
          GROUP BY BT.NAME, BT.LOCATION
         HAVING COUNT(*) > 1) A
  WHERE BT.ROWID <> A.UNQ
    AND BT.NAME = A.NAME
    AND BT.LOCATION = A.LOCATION
结果是

1   user1   1
2   user1   1
3   user2   1

您可以将 SELECT 替换为 DELETE 以删除重复记录。

希望能帮助到你

于 2012-05-10T08:49:21.230 回答