灵魂腐蚀 发表于 2015-1-16 22:15:34

MYSQL网页编程之删除Table表中的反复行的办法

珍贵的资金可以用于其他业务的启动,诸如市场、广告或调研和开发等。使用SQLServer2005的新功效NOW_NUMBER和CTE能够很好的完成.
举例申明以下:
创建测试数据:
复制代码代码以下:
createtableDup1
(
Col1intnull,
Col2varchar(20)null
)
insertintoDup1values
(1,"aaa"),
(2,"aaa"),
(2,"aaa"),
(2,"aaa"),
(3,"bbb"),
(3,"bbb"),
(4,"ccc"),
(4,"ddd"),
(5,"eee")
select*fromDup1

能够检察到反复的数占有:
复制代码代码以下:
SELECTCol1,Col2,COUNT(*)ASDupCountFROMDup1GROUPBYCol1,Col2HAVINGCOUNT(*)>1


接上去先容怎样delete失落反复的数据:
1.NOW_NUMBER:SQLServer2005增加了很好用的RANKING函数(NOW_NUMBER,RANK,DENSE_RANK,NTILE),使用NOW_NUMBER()OVER(PARTITIONGY)最为间接,也最为便利,不克不及修正表大概发生过剩的列.
起首会分派一个列号码,以Col1,Col2组合来分区排序.
复制代码代码以下:
SELECTCol1,Col2,ROW_NUMBER()OVER(PARTITIONBYCol1,Col2ORDERBYCol1)ASrnFROMDup1


失掉的序号以下:

很分明的是反复列都分组支解排序,只必要delete失落排序序号>1的便可.
复制代码代码以下:
--用到CTE
WITHDupsD
AS(
SELECTCol1,Col2,
ROW_NUMBER()OVER(PARTITIONBYCol1,Col2ORDERBYCol1)ASrn
FROMDup1
)
DELETEDupsD
WHERErn>1;
--大概
DELETEAFROM(
SELECTCol1,Col2,
ROW_NUMBER()OVER(PARTITIONBYCol1,Col2ORDERBYCol1)ASrn
FROMDup1)AWHEREA.rn>1

2.创立一个标识键独一的表记一列.
复制代码代码以下:
ALTERTABLEdbo.Dup1
ADD
PKINTIDENTITY
NOTNULL
CONSTRAINTPK_Dup1PRIMARYKEY;
SELECT*
FROMDup1;

删除找出与Col1,Col2不异而且比Dup1.PK年夜的纪录,也就是保存反复值中PK最小的纪录.
复制代码代码以下:
DELETEDup1
WHEREEXISTS(SELECT*
FROMDup1ASD1
WHERED1.Col1=Dup1.Col1
ANDD1.Col2=Dup1.Col2
ANDD1.PK>Dup1.PK);

3.selectdistantinto,这类办法借助一个新的table,把不反复的了局集转移到新table中.
复制代码代码以下:
SELECTdistinctCol1,Col2INTONoDupsFROMDup1;select*fromNoDups

倡议接纳第一种和第三种办法,第一种多见于T-SQL的编程中,第三种在ETL中经常利用.DBaaS并不意味着解决方案提供者要让自己失业。与其他系统一样,在实施DBaaS解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。

仓酷云 发表于 2015-1-19 06:17:45

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

简单生活 发表于 2015-1-24 18:35:33

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

爱飞 发表于 2015-2-2 11:50:13

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

飘飘悠悠 发表于 2015-2-7 19:56:58

入门没那么困难,精通没那么容易

冷月葬花魂 发表于 2015-2-23 09:44:54

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

蒙在股里 发表于 2015-3-7 07:34:52

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

海妖 发表于 2015-3-14 15:27:29

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

小妖女 发表于 2015-3-21 11:57:43

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
页: [1]
查看完整版本: MYSQL网页编程之删除Table表中的反复行的办法