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

lsmd5eda  于 2023-05-16  发布在  Oracle
关注(0)|答案(4)|浏览(250)

我有一个复合主键(a,b)的表。我在临时表中做了一个备份,但有些重复的记录是怎么来的。现在我不能移动备份记录到主表.
请提出一些方法来删除重复的临时表的基础上2列。表是oracle表,有7000万条记录,大约有400万个重复

hl0ma9xz

hl0ma9xz1#

你有两个选择:
1.在复制源表之前删除源表中的重复项
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;

作为替代方案(例如当某些列被定义为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)
643ylb08

643ylb082#

  1. orafaq中列出了3种方法
    1.消除重复记录的最简单方法是SELECT DISTINCT到临时表中,截断原始表,然后SELECT记录回到原始表中。详细信息here
  2. This one用于MSSQL Server,但我想同样的原则也适用于您的情况。
brccelvz

brccelvz3#

假设我有这样的数据
这里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

结果为
您可以用DELETE替换SELECT来删除重复的记录。
希望能帮上忙

6rqinv9w

6rqinv9w4#

我喜欢@a_horse_with_no_name的答案,但得到了一个错误
[HY000][1093] You can't specify target table 'example' for update in FROM clause
我用这个resource来扩展答案。我需要删除重复的行,因为这将是使用MySQL通过唯一复合索引(键)包含列的前兆。

DELETE FROM wp_example_table_name
WHERE (user_id1, user_id2) in (SELECT * FROM (SELECT user_id1, user_id2
                               FROM wp_example_table_name
                               GROUP BY user_id1, user_id2
                               HAVING COUNT(*) > 1) tmp)

相关问题