Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 从复合主键表中删除重复项_Oracle_Key_Sql Delete_Composite - Fatal编程技术网

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

Oracle 从复合主键表中删除重复项,oracle,key,sql-delete,composite,Oracle,Key,Sql Delete,Composite,我有一个带有复合主键a,b的表。我在临时表中做了一个备份,但有一些是如何出现重复记录的。现在我无法将备份记录移动到主表 请建议一些方法,根据2列删除临时表中的重复项。表是oracle表,有7000万条记录,大约400万条重复记录您有两个选项: 复制源表之前,请先删除源表中的重复项 首先不要复制副本。 第二个更有效,可以使用以下语句完成: INSERT INTO target_table (a,b,c,d,e,f) SELECT a,b,max(c),max(d),max(e),max(f) FR

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

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

您有两个选项:

复制源表之前,请先删除源表中的重复项 首先不要复制副本。 第二个更有效,可以使用以下语句完成:

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;
DELETE FROM source_table
WHERE rowid NOT IN (SELECT min(rowid)
                    FROM source_table
                    GROUP BY a,b
                    HAVING count(*) > 1)
作为替代方案,例如,当某些列被定义为CLOB或LONG,并且您无法对其应用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;
如果确实要首先删除行,可以使用以下语句执行此操作:

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;
DELETE FROM source_table
WHERE rowid NOT IN (SELECT min(rowid)
                    FROM source_table
                    GROUP BY a,b
                    HAVING count(*) > 1)
中列出了3种执行此操作的方法

消除重复记录的最简单方法是将DISTINCT选择到临时表中,截断原始表并将记录选择回原始表中。细节

一个是MSSQL服务器,但我想同样的原则也适用于您的情况

假设我有这样的数据

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

这里user13和user21有重复的记录

此查询将仅显示重复案例中的记录 因此,它显示的不是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以删除重复记录


希望它能有所帮助

谢谢,但我需要删除,所以我使用了一匹马的第三个选项,它有没有名字的答案谢谢,但我需要删除,所以我使用了一匹马的第三个选项,它有没有名字的答案伙计们,注意最后的删除语句。这可能不适合所有人。