zoukankan      html  css  js  c++  java
  • PL/SQL学习笔记(四)之——删除重复记录

     1 例:假设员工表中有若干记录重复,请删除重复的记录(某企业面试题)
     2 ------模拟建表
     3 create table employee(
     4        e_id varchar2(20) primary key,
     5        e_name varchar2(50) not null,
     6        e_sex char(2) check(e_sex in('男','女')),
     7        e_age integer 
     8 )
     9 insert into employee values('e001','Frank_Lei','男',20);
    10 insert into employee values('e002','Frank_Lei','男',20);
    11 insert into employee values('e003','Frank_Lei','男',20);
    12 insert into employee values('e004','Frank_Lei','男',20);
    13 insert into employee values('e005','美佳','女',18);
    14 insert into employee values('e006','美佳','女',18);
    15 insert into employee values('e007','美佳','女',18);
    16 insert into employee values('e008','美佳','女',18);
    17 insert into employee values('e010','美佳','女',19);
    18 insert into employee values('e009','二哈','男',8);
    19 select * from employee;
    20 --------------方法一-------------------------
    21 -----第一步:查询除 e_id 外其余字段均重复的记录
    22            select e_name,e_sex,e_age from employee group by e_name,e_sex,e_age having count(*)>1
    23 ----第二步:在除 e_id 外其余字段均重复的记录之中取 runid 最小的列(用于保留)
    24            select min(rowid) from employee group by e_name,e_sex,e_age having count(*)>1
    25 ---第三步:在一二步基础上筛选删除(删除除 e_id 之外所有字段均重复的记录,除过 runid 最小的记录)
    26            delete from employee e
    27            where (e.e_name,e.e_sex,e.e_age) in 
    28                      (select e_name,e_sex,e_age from employee group by e_name,e_sex,e_age having count(*)>1)
    29                      and
    30                      rowid not in
    31                      (select min(rowid) from employee group by e_name,e_sex,e_age having count(*)>1);
    32                      rollback;
    33 ------------------方法二(利用分组与not in)--------------------------
    34 delete from employee where e_id not in(select max(e_id) from employee e group by e.e_name,e.e_sex,e.e_age)

    用SQL语句,删除掉重复项只保留一条
    在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢
    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
    select * from people
    where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

    2、删除表中多余的重复记录,重复记录是根据单个字段(peopleName)来判断,只留有rowid最小的记录
    delete from people
    where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1)
    and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1)

    3、查找表中多余的重复记录(多个字段)
    select * from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
    delete from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
    and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
    select * from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
    and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)   
    6.消除一个字段的左边的第一位:
    update tableName set [Title]=Right([Title],(len([Title])-1)) where Title like '村%'
    7.消除一个字段的右边的第一位:
    update tableName set [Title]=left([Title],(len([Title])-1)) where Title like '%村'
    8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录
    update vitae set ispass=-1
    where peopleId in (select peopleId from vitae group by peopleId

  • 相关阅读:
    改造我们的学习:有钱不会花,抱着金库抓瞎
    (转)我奋斗了18年才和你坐在一起喝咖啡
    初学者要知道的十件事
    [转]C#图像处理 (各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)
    C#调用系统的复制、移动、删除文件对话框
    SQLite数据类型
    jquery禁用dropdownlist中某一项
    C# winform无标题窗体随意移动
    注册.NET Framework
    jQuery同步/异步调用后台方法
  • 原文地址:https://www.cnblogs.com/FrankLei/p/6617720.html
Copyright © 2011-2022 走看看