Oracle 从复合主键表中删除重复项
我有一个带有复合主键a,b的表。我在临时表中做了一个备份,但有一些是如何出现重复记录的。现在我无法将备份记录移动到主表 请建议一些方法,根据2列删除临时表中的重复项。表是oracle表,有7000万条记录,大约400万条重复记录您有两个选项: 复制源表之前,请先删除源表中的重复项 首先不要复制副本。 第二个更有效,可以使用以下语句完成: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
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以删除重复记录
希望它能有所帮助谢谢,但我需要删除,所以我使用了一匹马的第三个选项,它有没有名字的答案谢谢,但我需要删除,所以我使用了一匹马的第三个选项,它有没有名字的答案伙计们,注意最后的删除语句。这可能不适合所有人。