教你轻松解决几种常见的SQL疑难问题
2009-05-12 20:41:40来源:未知 阅读 ()
常见的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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- SQL Server中常见的数据类型有哪些 2020-01-23
- 剖析SQL Server连接中常见的三个错误 2018-12-02
- SQl 语句(常见) 2018-06-17
- 通过事务日志解决SQL Server常见四大故障 2009-05-12
- 解决MySQL 5数据库连接超时问题 2009-05-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash