文章关键字:|常见|SQL|疑难|问题|解决|选择|序列号|
常见的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)
原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9261
分享到:
相关推荐
Oracle SQL疑难解析是一本专为解决数据库操作中遇到的实际问题而编写的书籍,它涵盖了大量SQL查询、数据处理和性能优化的实用技巧。在"oracle-sql-recipes-master"这个压缩包中,很可能是包含了书中的示例代码和练习...
《Oracle SQL疑难解析》总结了针对Oracle数据库编写SQL时经常碰到的各种问题,提供大量现成的解决方法,包括汇总和聚合数据、多表数据查询、生成和获取数据、通用查询模式、日期和时间值的处理、字符串、处理数字、...
在使用 Oracle 数据库系统时,可能会遇到一些疑难问题,本文将从解决使用 Oracle SQL*PLUS 时没有监听器的问题开始,介绍一些相关的知识点。 标题:解决使用 Oracle 疑难问题 描述:解决使用 Oracle 中所遇到的...
《SQL2005疑难解决方案大全》是一份全面解析SQL Server 2005使用过程中常见问题及解决方法的文档,旨在帮助用户更好地理解和解决在SQL Server 2005环境中遇到的各种技术难题。 首先,文档提及了SQL2005中文乱码问题...
### 数据库疑难问题解决方法 #### 一、ORACLE客户端异常,无法连接服务器 **问题描述**:在尝试连接数据库时遇到错误提示,通常是因为数据库版本不一致所致。经过检查,发现服务器的安全日志中并无相关错误记录或...
本文将深入探讨SQL Server 2000的语法、函数以及解决常见疑难问题的方法,帮助你更好地理解和应用这个系统。 一、SQL Server 2000语法 1. 数据库操作:包括CREATE DATABASE用于创建数据库,ALTER DATABASE用于修改...
SQL Server 是一款由微软开发的关系型数据库管理系统,广泛应用于企业级数据存储和管理。...学习时,不仅要理论结合实践,还要不断探索和解决实际问题,这样才能更好地掌握SQL Server这一强大的数据库管理系统。
### MySQL 线上运维常见错误、疑难问题录 ...以上两种常见问题及其解决方案,对于进行MySQL线上运维工作的人员来说是非常实用的知识点。通过正确处理这些问题,可以有效提升数据库系统的稳定性和效率。
MySQL作为一款广泛使用的开源关系型数据库管理系统,在线上运维中不可避免地会遇到一些常见的错误和疑难问题。这些问题的出现可能会导致服务中断,数据丢失,或者性能下降等严重后果。因此,了解并掌握解决这些问题...
这个压缩包中的"Oracle数据库常见疑难解答.txt"文件很可能是包含了上述部分或所有知识点的具体问题及解决方案,对于数据库管理员和开发者来说,是宝贵的参考资料。通过深入学习和实践,可以提升解决Oracle数据库问题...
### VS2005(c#)项目调试疑难问题解决方法锦集 ...以上是针对VS2005(c#)项目调试过程中遇到的一些常见问题及其解决方案。通过这些方法,可以帮助开发者快速定位并解决问题,提高项目的稳定性和可维护性。
本文将详细介绍一些PHP中的常用函数和常见问题的解决方法,对于初学者来说是很好的参考资料。 1. 字符串操作函数: - `strlen()`:用于获取字符串的长度。 - `strcmp()` 和 `strcasecmp()`:分别进行区分和不区分...
用户可以使用这些工具来解决常见的问题。 其他 SQL Server 还提供了多种其他功能,包括数据类型转换、Spark 机器学习、PROSE 代码加速器、Delta Lake 等。用户可以根据需要使用这些功能来满足特定的需求。 SQL ...
这部分可能包含了Oracle使用过程中遇到的常见问题及其解决方案,如锁定问题、空间管理、备份恢复等,这些都是数据库管理员日常工作中常见的挑战。 8. **一个UPDATE语句,请教SQL编写高手** UPDATE语句的编写需要...
对于SQL初学者来说,理解数据库的基本概念和SQL Server 2005中的一些常见问题至关重要。 首先,我们来探讨为什么需要数据库。传统的数据存储方式,如大脑记忆、纸张记录或计算机内存,存在诸如遗忘、保存困难、查找...
本书不但融合了作者在使用SQL Server 2000过程中遇到的各种常见问题和应用案例,还总结了作者几年来在CSDN 社区SQL Server版所解决的大量问题,面向实际项目需求,涉及不同类型的应用,能够多角度地引导读者学习相关...
因此,本文将对 MySQL 数据库的常见问题进行排查和解决。 一、确认问题的来源 在解决问题之前,我们需要确认问题的来源。我们可以通过以下几个步骤来确认问题: * 是否所有用户打开都慢还是个别线路问题? * 每次...