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

MSSQL
SQL Server 2005对DBA的要求是否会更高
SQL Server新库和旧库数据字典的比较
一个获取SQL Server数据字典的经典SQL语句
三个SQL视图查出所有SQL Server数据库字典
解决SQL Server连接中最为常见的错误
Browser/Server结构浏览器和服务器结构介绍
Position方式构建Browser/Server结构
VS2003创建和打开ASP.net 工程的若干问题
ASP技巧教程:认识学习codepage的属性
SQL Server日志清除的两个方法
SQL Server端口更改后的数据库连接方式
SQL Server数据库的转储设备
用OMS来实现Oracle数据备份的方法
分析SQL Server的数据转换服务
SQL Server数据库快照形成报表
EFS加密技巧让数据更安全
SQL Server 如何将直接传递查询作为表使用
解析SQL Server 2008的商业智能
SQL Server数据库30步检查安全列表
转换 SQL数据库时的疑难问题

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 136 ::
收藏到网摘: 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语句中获取关联的统计项,对于中小型系统尤其实用。