ps:今天去面试被这个问题考倒了,sql要恶补一下了。
选择重复,消除重复和选择出序列
有例表:emp
emp_no name age
001 Tom 17
002 Sun 14
003 Tom 15
004 Tom 16
要求:
列出所有名字重复的人的记录
(1)最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了:
select name from emp group by name having count(*)>1
所有名字重复人的记录是:
select * from emp
where name in (select name from emp group by name having count(*)>1)
(2)稍微再聪明一点,就会想到,如果对每个名字都和原表进行比较,大于2个人名字与这条记录相同的就是合格的 ,就有
select * from emp where (select count(*) from emp e where e.name=emp.name) >1
--注意一下这个>1,想下如果是 =1,如果是 =2 如果是>2 如果 e 是另外一张表 而且是=0那结果 就更好玩了:)
这个过程是 在判断工号为001的 人 的时候先取得 001的 名字(emp.name) 然后和原表的名字进行比较 e.name
注意e是emp的一个别名。
再稍微想得多一点,就会想到,如果有另外一个名字相同的人工号不与她他相同那么这条记录符合要求:
select * from emp
where exists
(select * from emp e where e.name=emp.name and e.emp_no<>emp.emp_no)
此思路的join写法:
select emp.* from emp,emp e
where emp.name=e.name and emp.emp_no<>e.emp_no
/* 这个语句较规范的 join 写法是
select emp.* from emp inner join emp e on emp.name=e.name and emp.emp_no<>e.emp_no
但个人比较倾向于前一种写法,关键是更清晰 */
b、有例表:emp
name age
Tom 16
Sun 14
Tom 16
Tom 16
----------------------------------------------------清除重复----------------------------------------------------
过滤掉所有多余的重复记录
(1)我们知道distinct、group by 可以过滤重复,于是就有最直观的
select distinct * from emp 或 select name,age from emp group by name,age
获得需要的数据,如果可以使用临时表就有解法:
select distinct * into #tmp from emp
delete from emp
insert into emp select * from #tmp
(2)但是如果不可以使用临时表,那该怎么办?
我们观察到我们没办法区分数据(物理位置不一样,对 SQL Server来说没有任何区别),思路自然是想办法把数据区分出来了,既然现在的所有的列都没办法区分数据,唯一的办法就是再加个列让它区分出来,加什么列好?最佳选择是identity列:
alter table emp add chk int identity(1,1)
表示例:
name age chk
Tom 16 1
Sun 14 2
Tom 16 3
Tom 16 4
重复记录可以表示为:
select * from emp where (select count(*) from emp e where e.name=emp.name)>1
要删除的是:
delete from emp
where (select count(*) from emp e where e.name=emp.name and e.chk>=emp.chk)>1
再把添加的列删掉,出现结果。
alter table emp drop column chk
(3)另一个思路:
视图
select min(chk) from emp group by name having count(*) >1
获得有重复的记录chk最小的值,于是可以
delete from emp where chk not in (select min(chk) from emp group by name)
写成join的形式也可以:
(1)有例表:emp
emp_no name age
001 Tom 17
002 Sun 14
003 Tom 15
004 Tom 16
◆要求生成序列号
(1)最简单的方法,根据b问题的解法:
alter table emp add chk int identity(1,1) 或
select *,identity(int,1,1) chk into #tmp from emp
◆如果需要控制顺序怎么办?
select top 100000 *,identity(int,1,1) chk into #tmp from emp order by age
(2) 假如不可以更改表结构,怎么办?
如果不可以唯一区分每条记录是没有办法的,在可以唯一区分每条记录的时候,可以使用a 中的count的思路解决这个问题
select emp.*,(select count(*) from emp e where e.emp_no<=emp.emp_no)
from emp
order by (select count(*) from emp e where e.emp_no<=emp.emp_no)
分享到:
相关推荐
在SQL中,查询和清除重复数据是数据库管理中常见的任务,尤其在面试中,这个问题经常被用来测试候选人的技能和经验。以下是对这个主题的详细解释。 首先,我们需要理解什么是重复数据。在数据库中,重复数据指的是...
在SQL领域,查询和清除重复数据是常见的数据库管理任务,对于面试者来说,掌握这部分知识至关重要。本主题将深入探讨如何使用SQL来检测并处理重复数据。 首先,我们需要理解什么是重复数据。在数据库中,重复数据指...
最后,清空原表`Products`,并将`Products_temp`表中的数据导入,以替换原有的重复数据。完成后,删除临时表`Products_temp`。 ```sql DELETE Products INSERT INTO Products SELECT * FROM Products_temp DROP ...
标题和描述概述的知识点主要集中在SQL语言中处理表内重复数据的方法上,涵盖了查询与删除重复数据的不同场景。下面将详细解析这些知识点: ### 查询表中重复数据 #### 单字段重复数据查询 ```sql SELECT * FROM ...
【SQL数据查询与更新实验报告】的实验主要涵盖了SQL语言中的关键操作,旨在让学生熟练掌握对数据库进行数据查询和更新的方法。以下是对实验内容的详细解释: ### 1. SQL数据查询 #### 1.1 单表查询 - **查询所有列...
### SQL删除表里重复数据的两种方法 在数据库管理中,数据的一致性和准确性是非常重要的。重复的数据不仅会占用额外的存储空间,还可能导致查询结果的不准确。因此,掌握如何有效地删除表中的重复记录是每个数据库...
当查询的结果可能包含重复的行时,可以使用`DISTINCT`关键字来消除重复,确保结果集中的每条记录都是唯一的。例如,在查询选修过课程的学生学号时: ```sql SELECT DISTINCT Sno FROM SC; ``` 这条语句将返回所有...
该实验报告主要介绍了 SQL 数据查询和更新的实验步骤,旨在熟悉 SQL 语句的数据查询语言,并能够对数据库进行单表查询、连接查询、嵌套查询、集合查询和统计查询。 一、单表查询 * 查询的目标表达式可以是所有列、...
在数据库管理中,清理重复数据是一项常见的任务,尤其是在数据整合或迁移过程中,或是为了保持数据的完整性和准确性。本文将详细解析如何通过SQL语句来有效地清除单字段或多字段的重复数据,确保数据库中的每条记录...
基于此理解,我们将围绕SQL中处理重复数据的关键技术进行探讨,包括`DISTINCT`关键字、自定义查询以及可能涉及的相关操作。 ### SQL中的`DISTINCT`关键字 #### 1. `DISTINCT`关键字简介 在SQL中,`DISTINCT`关键字...
这种方式不仅清除了重复数据,而且保证了原表的数据结构和名称不变,对数据库的其他部分没有影响。 ### 总结 在Oracle中删除表中的重复数据是一个涉及到数据安全性和效率的关键操作。通过上述步骤,可以有效地清除...
总结来说,清除SQL数据库中的重复记录是数据治理的关键部分,可以通过检测和删除步骤实现。同时,通过合理的设计和约束,可以预防重复记录的产生。在进行这些操作时,务必确保数据的安全,并定期检查和维护数据库的...
- **定义与原理**:全局重复数据消除是一种在多个数据源之间识别和删除重复数据副本的过程。EMC Avamar通过将数据分割成较小的数据段,并在这些段之间查找重复项来实现这一点。 - **技术优势**:这种方法极大地减少...
在SQL Server中,有时我们需要处理重复数据,确保数据库中只保留每组重复数据的一个实例,通常是最早或最新的记录。在给定的标题和描述中,我们看到一个具体的方法来实现这个目标,即通过创建临时表并利用`identity`...
在SQL语句中,处理重复数据是一项常见的任务。在给定的标题和描述中,主要涉及如何找出并处理数据库表中的重复记录。这里我们将详细探讨几种不同的方法。 首先,要找出重复的记录,我们可以利用`GROUP BY`和`HAVING...
本文将深入讲解SQL查询的各种类型和技巧,包括基本查询、别名使用、消除重复行、比较运算符、取值范围以及模糊查询。 首先,SQL查询分为多种类型。例如,可以创建不涉及任何表的查询,如示例中的"age: 2008 years, ...
本文将探讨如何利用Infopath2007和JavaScript扩展其功能,以实现对SQL Server 2005数据库的范围数据查询。 首先,我们需要创建一个基于SQL Server的Infopath表单模板。打开Infopath2007,选择“设计表单模板” → ...
SQL去重是指清除查询结果或者是数据库里不必要的相对某个字段的冗余数据。对于查询结果去重,可以使用distinct关键字标注需要去重的字段,也可以使用group by + 关键字。 使用distinct关键字可以取得不重复的值,...
基于重复数据删除技术的SQL Server数据库备份系统是一种优化备份效率和存储空间的有效方法。本文将深入探讨这种技术的工作原理、优势以及如何在实际操作中实施。 首先,理解重复数据删除(Data Deduplication)的...