`
weigang.gao
  • 浏览: 488067 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

oracle去重(面试)

 
阅读更多

现有Oracle中数据如下:


 

第一种方法:

使用多层嵌套查询,这种方法会多次扫描表

1.通过emp_no进行分组,查询出每个分组中最大的ID

select max(id) from employee t group by t.emp_no having count(1) > 1;


 

2.删除重复记录,但这样只能删除具有2条的重复记录。如果具有2条以上的重复记录,则无法删除

delete from employee t where t.id in (select max(t1.id) from employee t1 group by t1.emp_no having count(1) > 1)

 

优化如下:

①获取有重复记录的员工记录

select t1.* from employee t1 where t1.emp_no in (select t.emp_no  from employee t group by t.emp_no having count(1) > 1) 

②从重复记录的员工号中获取最小的id

select min(t2.id) from (select t1.* from employee t1 where t1.emp_no in (select t.emp_no  from employee t group by t.emp_no having count(1) > 1)) t2 group by t2.emp_no

③将①和②结合查询出多余的重复记录

select t1.* from employee t1 where t1.emp_no in (select t.emp_no  from employee t group by t.emp_no having count(1) > 1) 

and t1.id not in (

select min(t2.id) from (select t1.* from employee t1 where t1.emp_no in (select t.emp_no  from employee t group by t.emp_no having count(1) > 1)) t2 group by t2.emp_no

)

④删除重复记录

delete from employee t3  where t3.id in (

    select t1.* from employee t1 where t1.emp_no in (select t.emp_no  from employee t group by t.emp_no having count(1) > 1) 

    and not in (

         select min(t2.id) from (select t1.* from employee t1 where t1.emp_no in (select t.emp_no  from employee t group by t.emp_no having count(1) > 1)) t2 group by t2.emp_no

    )

)

 

 

 

第二种方法(推荐):

使用row_number()  over()

1.先通过emp_no进行分组,然后通过sal进行排序,得到序列seq

select t.* , row_number() over(partition by t.emp_no order by t.sal desc)  seq from employee t



 

 

2.获取每个分组中序列seq大于1记录的id

select t1.id
  from (select t.*,
               row_number() over(partition by t.emp_no order by t.sal desc) seq
          from employee t) t1
 where t1.seq > 1

3.删除重复记录

delete from employee t2
 where t2.id in (select t1.id
                   from (select t.*,
                                row_number() over(partition by t.emp_no order by t.sal desc) seq
                           from employee t) t1
                  where t1.seq > 1)

 

 

  • 大小: 7.8 KB
  • 大小: 11.3 KB
  • 大小: 3.6 KB
分享到:
评论

相关推荐

    Oracle经典面试总结-去重-附答案.pdf

    Oracle经典面试总结 本文档总结了 Oracle 数据库相关的面试问题和答案,涵盖了 optimizer_mode、CBO、RBO、索引、排序、表空间、回滚段、绑定变量、SQL 优化等多个方面的知识点。 _optimizer_mode_ Optimizer_...

    常见Oracle数据库面试题目

    ### 常见Oracle数据库面试题目解析 #### 1. 列出至少有一个员工的所有部门 此题旨在考察考生如何筛选出至少有一名员工所在的部门。解决方案是通过使用`GROUP BY`结合`HAVING`子句来实现。具体步骤如下: - 使用`...

    ORACLE_PL-SQL超经典面试题

    总结:这些面试题主要涉及了Oracle数据库的PL/SQL编程技巧,包括JOIN操作、视图的创建与使用、以及数据更新和去重策略。解答这些问题需要对数据库原理和SQL语言有深入的理解,特别是如何高效地处理数据和维护数据的...

    oracle/mysql 数据库面试 真题

    1. **去重查询**:`SELECT DISTINCT column_name FROM table_name;`用于查询表中的不重复记录。例如,查询`studentinfo`表中所有不重复的班级编号: ```sql SELECT DISTINCT classnum FROM studentinfo; ``` 2....

    自己的Oracle学习笔记

    13. **SQL面试题**:这些操作和概念经常出现在Oracle相关的面试题中,理解并掌握它们对于面试和实际工作至关重要。 这些只是Oracle SQL语法的基础部分,Oracle还有更多高级特性,如索引、视图、存储过程、触发器、...

    数据库常见面试题

    ### 数据库常见面试题解析 #### 1、数据库有哪几种范式? 数据库设计中遵循的规范称为“范式”,目前主要有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF(Boyce-Codd范式)、第四范式(4NF...

    DBA面试题

    本文详细介绍了DBA面试中常见的几个技术问题及其解析,包括UNION ALL与UNION的区别、使用CREATE DATABASE语句创建数据库的好处、密码安全规则及其在Oracle中的实现方法、Oracle Wait Interface的基本概念、如何返回...

    JAVA+ORALCE面试题汇总

    ### JAVA+ORACLE面试题汇总知识点解析 #### 1. Overload、Override与Overloaded的区别是什么? - **Overload(重载)**:在同一个类中可以定义多个方法,只要它们的方法名相同而参数列表不同即可。参数列表的不同...

    java面试经验解析.zip

    还要了解集合与数组的区别,以及如何进行集合的遍历、排序和去重。 4. **内存模型**:理解JVM(Java虚拟机)的工作原理,包括堆内存、栈内存、方法区等,以及垃圾回收机制。 5. **多线程**:掌握线程的创建方式...

    面试常问问题.doc

    在Java面试中,面试官通常会关注候选人的技术能力、问题解决技巧以及团队协作态度。以下是对【标题】"面试常问问题.doc"和【描述】中涉及的一些关键知识点的详细解析: 1. **项目经验**:面试官询问你的上一家公司...

    大型软件公司.net面试题!一定得看(附答案

    以上是针对.NET面试题中的关键知识点的详细解释,涵盖了变量交换、排序算法、多态、会话管理、并发控制、数据库操作、数据去重以及JavaScript编程等多个方面。这些知识对于.NET开发者来说非常重要,理解和掌握它们有...

    MySql面试题.doc

    - Oracle:由甲骨文公司开发,广泛应用于大型企业。 - MySQL:开源数据库,现归甲骨文所有。 - DB2:IBM公司的数据库系统。 - SQL Server:微软公司的数据库产品。 - Sybase:赛尔斯公司的数据库系统。 4. 表...

    海联讯科技Java面试题.doc

    【海联讯科技Java面试题】的文档涵盖了多个Java编程和技术框架的相关问题,以下是这些问题的详细解析: 1. **合并去重字符串数组** - 题目要求编写一个方法,将两个字符串数组合并并去除重复元素。可以使用HashSet...

    SQL常见面试题.txt

    以上就是从给定文件中提取出的关于 SQL 常见面试题的关键知识点及解析,涵盖了删除表中重复记录、Oracle 中的分页以及如何找出每个部门员工工资最高的前三名等实用技巧。希望这些内容能帮助读者更好地理解和掌握 SQL...

    数据库面试宝典.doc

    另外,对于更复杂的去重需求,可能需要结合`GROUP BY`和`HAVING`子句,或者使用窗口函数`ROW_NUMBER()`,`RANK()`或`DENSE_RANK()`。 2. **查询最大或最小的前几个数据** 要找出收入最高的前三名员工,可以使用子...

    SQL面试题SQL面试题SQL面试题

    以下是一些常见的SQL面试题及其解答,涉及了数据查询、去重、联接、子查询以及数据转换等多个方面: 1. **查询每门课都大于80分的学生**: ```sql SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT ...

    SQL面试题:经典例.docx

    + 去重 distinct() + 统计总数 sum() + 计算个数 count() + 平均数 avg() + 最大值 max() + 最小数 min() 多表连接 * 内连接(省略默认 inner):join ... on ... * 左连接:left join ... on ... * 右连接...

    2016面试汇总.doc

    【面试汇总】文档包含了2016年面试中的一些常见问题,主要涵盖了Java编程、Spring框架、多线程、集合框架、数据库、设计模式以及面向切面编程等多个方面的知识点。 1. **抽象类与接口的区别**: 抽象类是类的一个...

    net面试题及答案(一)归类.pdf

    9. 数据去重:在有主键和外键约束的数据库中,不能有重复数据。可以通过添加自增ID字段,然后删除重复行,或者使用窗口函数结合`ROW_NUMBER()`来找出并删除重复数据。 以上是针对.NET面试题及答案中提到的关键知识...

    数据库笔试面试题及答案解析(一)

    这是因为这些视图可能涉及到复杂的查询逻辑,比如去重或者分组,这些操作在DML层面难以支持。因此,选项e)表示“上面所有视图都不允许DML操作”是正确的。 ### 2. SQL命令的有效性判断 **题目:** 下面哪一个是有效...

Global site tag (gtag.js) - Google Analytics