从复合主键表中删除重复项

时间:2012-05-09 14:03:16

标签: oracle key sql-delete composite

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

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

3 个答案:

答案 0 :(得分:3)

您有两种选择:

  1. 在复制之前删除源表中的重复项
  2. 首先不要复制重复项。
  3. 第二个更有效,可以使用以下声明完成:

    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;
    

    作为替代方案(例如,当某些列定义为CLOBLONG且您无法对其应用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)
    

答案 1 :(得分:1)

  1. orafaq

  2. 中列出了3种方法
  3. 消除重复记录的最简单方法是将SELECT DISTINCT写入临时表,截断原始表并将记录选择回原始表。详情here

  4. This一个用于MSSQL Server,但我想同样的原则也适用于您的情况。

答案 2 :(得分: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替换SELECT以删除重复的记录。

希望有所帮助