我有一个包含复合主键(a,b)的表。我在临时表中进行了备份,但是有些重复记录是如何出现的。现在无法将备份记录移动到主表。
请提示一些基于2列删除临时表中重复项的方法。表是oracle表,有7000万条记录,大约有400万条重复记录
答案 0 :(得分: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;
作为替代方案(例如,当某些列定义为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;
如果您真的想先删除行,可以使用以下语句执行此操作:
DELETE FROM source_table
WHERE rowid NOT IN (SELECT min(rowid)
FROM source_table
GROUP BY a,b
HAVING count(*) > 1)
答案 1 :(得分:1)
答案 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以删除重复的记录。
希望有所帮助