我有一个带有复合主键(a,b)的表。我在临时表中进行了备份,但有些重复记录是如何出现的。现在无法将备份记录移动到主表。
请建议一些方法来删除基于 2 列的临时表中的重复项。表是 oracle 表,有 7000 万条记录,大约 400 万个重复项
我有一个带有复合主键(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;
作为替代方案(例如,当某些列被定义为CLOB
orLONG
并且您不能对它们应用 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 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 以删除重复记录。
希望能帮助到你