zoukankan      html  css  js  c++  java
  • oracle删除重复数据

    数据库没设主键,当要设主键时发现表中已有重复数据。下面的代码展示了删除重复数据的方法:

    --创建测试表
    -- Create table
    create table TEST_T1
    (
      test_id   VARCHAR2(8),
      test_name VARCHAR2(10),
      test_type VARCHAR2(4)
    )
    tablespace EXAMPLE
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64
        minextents 1
        maxextents unlimited
      );
    -- Add comments to the table 
    comment on table TEST_T1
      is '测试表';
    
    --添加数据
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('1', 'NAME1', '1');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('1', 'NAME2', '2');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('2', 'NAME3', '1');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('2', 'NAME4', '2');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('3', 'NAME5', '1');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('3', 'NAME6', '2');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('4', 'NAME7', '1');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('5', 'NAME8', '2');
    insert into TEST_T1 (test_id, test_name, test_type)
    values ('6', 'NAME9', '1');
    
    --查询
    select t.*, t.rowid from TEST_T1 t ;
    --确认主键是否重复
    select t.test_id from test_t1 t
    group by t.test_id
    having count(*)>1
    select t.test_id,t.test_type from test_t1 t
    group by t.test_id,t.test_type
    having count(*)>1
    
    --选择重复数据
    select t.*,rowid from TEST_T1 t 
    where t.test_id in (
                        select t.test_id  from TEST_T1 t 
                        group by t.test_id
                        having count(*)>1
          )
          and rowid not in (
                        select min(rowid) from TEST_T1 t 
                        group by t.test_id
                        having count(*)>1 
          ) 
    --删除重复数据,只各留一条
    delete from TEST_T1 t 
    where t.test_id in (
                        select t.test_id  from TEST_T1 t 
                        group by t.test_id
                        having count(*)>1
          )
          and rowid not in (
                        select min(rowid) from TEST_T1 t 
                        group by t.test_id
                        having count(*)>1 
          ) 

    以上测试表假设要设的主键只有一个(test_id),如果主键为多个的情况,可以在代码中相应部分替换掉test_id。如下:

    select t.*,rowid from SR_HCS4FYKM t 
    where (CSKCSID,CSKPJLX,CSKKMBH) in (
                        select CSKCSID,CSKPJLX,CSKKMBH  from SR_HCS4FYKM t 
                        group by CSKCSID,CSKPJLX,CSKKMBH
                        having count(*)>1
          )
          and rowid not in (
                        select min(rowid) from SR_HCS4FYKM t 
                        group by CSKCSID,CSKPJLX,CSKKMBH
                        having count(*)>1 
          ) 

    删除了重复数据后就可以设置主键(test_id)了。

  • 相关阅读:
    Inno Setup区段之Dirs篇
    Inno Setup区段之Tasks篇
    leetcode刷题-69x的平方根
    7.27 判断子序列
    7.26 矩阵中的最长递增路径
    PMP | 备考笔记
    数据结构--数组存储二叉树(Java)
    数据结构--哈希表(Java)
    查找--斐波那契查找(Java)
    牛客网--字节跳动面试题--特征提取
  • 原文地址:https://www.cnblogs.com/qinxike/p/2523719.html
Copyright © 2011-2022 走看看