总结:去除表中重复行

问题:
去除数据库表重复行中是非常常见的需求,一下是我根据一些资料总结的几种方法。
解决:
目标:表中 empname 与 orderdate 相同的记录只保留一行。
数据初始化:
Select empname,orderdate,identity(int,1,1) as keycol
Into #duptb
From (
 Select '张三' as empname,'2006-07-04'  as orderdate Union All
 Select '张三','2006-07-08' Union All
 Select '张三','2006-07-08' Union All
 Select '李四','2006-07-08' Union All
 Select '李四','2006-07-09' Union All
 Select '李四','2006-07-10' Union All
 Select '王五','2006-07-11' Union All 
 Select '王五','2006-07-11' Union All
 Select '狗二','2006-07-15' Union All
 Select '狗二','2006-07-16' 
 )as tt
Go

一、如果结果集中需要empname与orderdate两列时,直接用Distinct就可以了。
Select distinct empname,orderdate
From(
	Select empname,orderdate
	From #duptb)as tt
--(8 行受影响)
二、或者使用Group by
Select empname,orderdate
From #duptb
Group by empname,orderdate
--(8 行受影响)
三、如果要求结果集包含除分组列的其他属性(使用窗口函数 )
----------表中 empname与orderdate重复的记录,只保留一条
--不使用keycol MS SqlServer2008
with tb as
	(Select empname,orderdate,keycol,
	 ROW_NUMBER() Over(Partition by empname,orderdate Order by empname,orderdate) as rn
 	 From #duptb
	)
Select *
From tb
Where rn <2	--(8 行受影响)
--(8 行受影响)
四、如果要求结果集包含除分组列的其他属性(使用子查询)
--method2 --使用keycol
Select t1.empname,t1.orderdate
From #duptb as t1
Where Not Exists(
	Select *
	From #duptb as t2
	Where t1.empname = t2.empname
	    And t1.orderdate = t2.orderdate
	    And t1.keycol < t2.keycol
)
--(8 行受影响)
五、如果要求结果集包含除分组列的其他属性(使用子查询)
--表中 empname与orderdate重复的记录,只保留一条,使用keycol
Select t1.empname,t1.orderdate,t1.keycol
From #duptb as t1
Where keycol In(Select MIN(keycol)
	       From #duptb as t2
	       Group by empname,orderdate
	       )
--(8 行受影响)

总结:
以上四种方法在数据量不同、索引不同等其他因素存在时有很大性能差异。
比如说,数据量少时,方法四一般会比方式三更具性能优势,尽管其看似要进行两次表扫描或查找。
方式五是所有方式中性能最差的。
如果结果集仅需要分组列,建议选择方式一、方式二、方式三。
如果结果集需要除分组列的其他列,可以考虑方式三与方式四。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中关村网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值