现有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)
相关推荐
Oracle经典面试总结 本文档总结了 Oracle 数据库相关的面试问题和答案,涵盖了 optimizer_mode、CBO、RBO、索引、排序、表空间、回滚段、绑定变量、SQL 优化等多个方面的知识点。 _optimizer_mode_ Optimizer_...
### 常见Oracle数据库面试题目解析 #### 1. 列出至少有一个员工的所有部门 此题旨在考察考生如何筛选出至少有一名员工所在的部门。解决方案是通过使用`GROUP BY`结合`HAVING`子句来实现。具体步骤如下: - 使用`...
总结:这些面试题主要涉及了Oracle数据库的PL/SQL编程技巧,包括JOIN操作、视图的创建与使用、以及数据更新和去重策略。解答这些问题需要对数据库原理和SQL语言有深入的理解,特别是如何高效地处理数据和维护数据的...
1. **去重查询**:`SELECT DISTINCT column_name FROM table_name;`用于查询表中的不重复记录。例如,查询`studentinfo`表中所有不重复的班级编号: ```sql SELECT DISTINCT classnum FROM studentinfo; ``` 2....
13. **SQL面试题**:这些操作和概念经常出现在Oracle相关的面试题中,理解并掌握它们对于面试和实际工作至关重要。 这些只是Oracle SQL语法的基础部分,Oracle还有更多高级特性,如索引、视图、存储过程、触发器、...
### 数据库常见面试题解析 #### 1、数据库有哪几种范式? 数据库设计中遵循的规范称为“范式”,目前主要有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF(Boyce-Codd范式)、第四范式(4NF...
本文详细介绍了DBA面试中常见的几个技术问题及其解析,包括UNION ALL与UNION的区别、使用CREATE DATABASE语句创建数据库的好处、密码安全规则及其在Oracle中的实现方法、Oracle Wait Interface的基本概念、如何返回...
### JAVA+ORACLE面试题汇总知识点解析 #### 1. Overload、Override与Overloaded的区别是什么? - **Overload(重载)**:在同一个类中可以定义多个方法,只要它们的方法名相同而参数列表不同即可。参数列表的不同...
还要了解集合与数组的区别,以及如何进行集合的遍历、排序和去重。 4. **内存模型**:理解JVM(Java虚拟机)的工作原理,包括堆内存、栈内存、方法区等,以及垃圾回收机制。 5. **多线程**:掌握线程的创建方式...
在Java面试中,面试官通常会关注候选人的技术能力、问题解决技巧以及团队协作态度。以下是对【标题】"面试常问问题.doc"和【描述】中涉及的一些关键知识点的详细解析: 1. **项目经验**:面试官询问你的上一家公司...
以上是针对.NET面试题中的关键知识点的详细解释,涵盖了变量交换、排序算法、多态、会话管理、并发控制、数据库操作、数据去重以及JavaScript编程等多个方面。这些知识对于.NET开发者来说非常重要,理解和掌握它们有...
- Oracle:由甲骨文公司开发,广泛应用于大型企业。 - MySQL:开源数据库,现归甲骨文所有。 - DB2:IBM公司的数据库系统。 - SQL Server:微软公司的数据库产品。 - Sybase:赛尔斯公司的数据库系统。 4. 表...
【海联讯科技Java面试题】的文档涵盖了多个Java编程和技术框架的相关问题,以下是这些问题的详细解析: 1. **合并去重字符串数组** - 题目要求编写一个方法,将两个字符串数组合并并去除重复元素。可以使用HashSet...
以上就是从给定文件中提取出的关于 SQL 常见面试题的关键知识点及解析,涵盖了删除表中重复记录、Oracle 中的分页以及如何找出每个部门员工工资最高的前三名等实用技巧。希望这些内容能帮助读者更好地理解和掌握 SQL...
另外,对于更复杂的去重需求,可能需要结合`GROUP BY`和`HAVING`子句,或者使用窗口函数`ROW_NUMBER()`,`RANK()`或`DENSE_RANK()`。 2. **查询最大或最小的前几个数据** 要找出收入最高的前三名员工,可以使用子...
以下是一些常见的SQL面试题及其解答,涉及了数据查询、去重、联接、子查询以及数据转换等多个方面: 1. **查询每门课都大于80分的学生**: ```sql SELECT DISTINCT name FROM table WHERE name NOT IN (SELECT ...
+ 去重 distinct() + 统计总数 sum() + 计算个数 count() + 平均数 avg() + 最大值 max() + 最小数 min() 多表连接 * 内连接(省略默认 inner):join ... on ... * 左连接:left join ... on ... * 右连接...
【面试汇总】文档包含了2016年面试中的一些常见问题,主要涵盖了Java编程、Spring框架、多线程、集合框架、数据库、设计模式以及面向切面编程等多个方面的知识点。 1. **抽象类与接口的区别**: 抽象类是类的一个...
9. 数据去重:在有主键和外键约束的数据库中,不能有重复数据。可以通过添加自增ID字段,然后删除重复行,或者使用窗口函数结合`ROW_NUMBER()`来找出并删除重复数据。 以上是针对.NET面试题及答案中提到的关键知识...
这是因为这些视图可能涉及到复杂的查询逻辑,比如去重或者分组,这些操作在DML层面难以支持。因此,选项e)表示“上面所有视图都不允许DML操作”是正确的。 ### 2. SQL命令的有效性判断 **题目:** 下面哪一个是有效...