当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL SERVER 删除重复内容行

MSSQL
将代码页从SQL Server 7.0改变到SQL Server 2000
浅析SQL SERVER一个没有公开的存储过程
使用存储过程时一个错误的解决方法
执行一个安全的SQL Server安装
SQL导出到MYSQL的简单方法
SQL Server 7六种数据移动方法
数据库升迁从sqlserver6.5到sqlserver2000
用SQL 2000创建用户化XML流
解决SQL Server 2000之日志传送功能
保持多台服务器数据的一致性
将ACCESS转化成SQL2000需要注意的几个问题
一次特殊的SQL Server安装奇遇
实现上千万条数据的分页显示
使用用于SQL Server的IIS虚拟目录管理实用工具
SQL Server连接ACCESS数据库的实现
使用SQL Server数据转换服务升迁Access数据库
SQLServer和Access、Excel数据传输简单总结
XML文件导入SQL Server 2000
在视图中使用ORDER BY子句
内嵌或嵌入SQL和存储过程之对比

MSSQL 中的 SQL SERVER 删除重复内容行


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 80 ::
收藏到网摘: n/a

刚解决的小问题,之前也解决过类似的问题,但这次还设计到用SQL语句加一列,平时不常用这种命令,还是记录一下吧。 对于重复行删除的问题,网上很难找到合适的答案,问问题的不少,但在搜索引擎中草草地看了一下前面的记录都没有解决方案。
其实这个问题可以很华丽的解决。
1、如果这张表没有主键(或者相同的行并没有不相同的内容列),则需要新建一个自增列,用来区分不同列。例如
复制代码 代码如下:

alter table [tablename] add [TID] int IDENTITY(1,1)

就是增加一个自增量的临时列TID。
为啥要用SQL语句?如果超过几十万行的话用SQL SERVER企业管理器的设计界面修改通常会超时。
2、然后就是关键了。给个例子就是我手上正要处理的IP地址所在地清单。近40万条数据,有SIP和EIP(开始IP和结束IP)记录重复,重复条数大概占1/5左右。对此情况用简单的一条SQL命令就搞定:
复制代码 代码如下:

delete from query_IP where TID not in (select max(TID) from query_IP group by SIP,EIP)

就是将SIP和EIP分组,取得同样分组的最大的TID值。然后将原表中不在其中的内容(也就是同样分组的重复内容中更小的ID内容)删除即可。
用这种思路可以延伸出很多SQL解题的方式。比如说某个用户登陆表,要查看每个用户最近的登陆记录。
很优雅的一条查询语句:
复制代码 代码如下:

Select * from LoginLog where ID in (select max(ID) from LoginLog group by UserID)

SQL强大之极,许多复杂的需求往往可以合并到一条SQL语句查询中实现。因此在我的程序中除了UPDATE/INSERT等操作需要事务支持,或是记录量实在太大需要分页或临时表。通常都用一条SQL语句来实现。比如说select *,(select count(*) from xxx where xxx=t.ID) from t where...。这样就可以在SELECT语句中获取关联的统计项,对于中小型系统尤其实用。