仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 962|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之教你轻松办理几种罕见的SQL疑问成绩

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:16:47 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使为了数据安全,我们搭建了主从。但实时主从备份只能防止硬件问题,比如主库的硬盘损坏。但对于误操作,则无能为力。比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新。罕见的SQL成绩:
◆选择反复,打消反复和选择出序列
有例表:emp
emp_nonameage
001Tom17
002Sun14
003Tom15
004Tom16
请求:
列出一切名字反复的人的纪录
(1)最直不雅的思绪:要晓得一切名字有反复人材料,起首必需晓得哪一个名字反复了:
selectnamefromemp
groupbyname
havingcount(*)>1
一切名字反复人的纪录是:
select*fromemp
where
namein(
selectnamefromemp
groupbyname
havingcount(*)>1
)
(2)略微再伶俐一点,就会想到,假如对每一个名字都和原表举行对照,年夜于2团体名字与这笔记录像同的就是及格的,就有
select*fromemp
where
(selectcount(*)fromemp
ewheree.name=emp.name)
>1
--注重一下这个>1,想下假如是=1,假如是=2假如是>2假如e是别的一张表并且是=0那了局就更好玩了:)
这个历程是在判别工号为001的人的时分先获得001的名字(emp.name)然后和原表的名字举行对照e.name
注重e是emp的一一般名。
再略微想很多一点,就会想到,假如有别的一个名字不异的野生号不与她他不异那末这笔记录切合请求:
select*fromemp
whereexists
(select*fromempewhere
e.name=emp.nameande.emp_noemp.emp_no)
此思绪的join写法:
selectemp.*
fromemp,empe
where
emp.name=e.nameandemp.emp_noe.emp_no
/*
这个语句较标准的join写法是
selectemp.*
fromempinnerjoinempe
on
emp.name=e.nameandemp.emp_noe.emp_no
但团体对照偏向于前一种写法,关头是更明晰
*/
b、有例表:emp
nameage
Tom16
Sun14
Tom16
Tom16
请求:
过滤失落一切过剩的反复纪录
(1)我们晓得distinct、groupby能够过滤反复,因而就有最直不雅的
selectdistinct*fromemp

selectname,agefromempgroupbyname,age
取得必要的数据,假如可使用一时表就有解法:
selectdistinct*into#tmpfromemp
deletefromemp
insertintoempselect*from#tmp
(2)可是假如不成以利用一时表,那该怎样办?
我们察看到我们没举措辨别数据(物理地位纷歧样,对SQLServer来讲没有任何区分),思绪天然是想举措把数据辨别出来了,既然如今的一切的列都没举措辨别数据,独一的举措就是再加个列让它辨别出来,加甚么列好?最好选择是identity列:
altertableempaddchkintidentity(1,1)
暗示例:
nameagechk
Tom161
Sun142
Tom163
Tom164
反复纪录能够暗示为:
select*fromemp
where
(selectcount(*)fromempewheree.name=emp.name)>1
要删除的是:
deletefromemp
where
(selectcount(*)fromempewhere
e.name=emp.nameande.chk>=emp.chk)>1
再把增加的列删失落,呈现了局。
altertableempdropcolumnchk
(3)另外一个思绪:
视图
selectmin(chk)
fromemp
groupbyname
havingcount(*)>1
取得有反复的纪录chk最小的值,因而能够
delete
fromemp
where
chknotin
(
selectmin(chk)
fromemp
groupbyname
)
写成join的情势也能够:
(1)有例表:emp
emp_nonameage
001Tom17
002Sun14
003Tom15
004Tom16
◆请求天生序列号
(1)最复杂的办法,依据b成绩的解法:
altertableempaddchkintidentity(1,1)
或select*,identity(int,1,1)chkinto#tmpfromemp
◆假如必要把持按次怎样办?
selecttop100000*,identity(int,1,1)
chkinto#tmpfromemporderbyage
(2)假设不成以变动表布局,怎样办?
假如不成以独一辨别每笔记录是没有举措的,在能够独一辨别每笔记录的时分,可使用a中的count的思绪办理这个成绩
selectemp.*,(selectcount(*)from
empewheree.emp_no<=emp.emp_no)
fromemp
orderby(selectcount(*)from
empewheree.emp_no<=emp.emp_no)
使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-14 16:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表