sql server 2000中重复列删除示例

来源:互联网 发布:孙尚香出装 知乎 编辑:程序博客网 时间:2024/05/19 00:15
 以下网址是官方的解决方案

http://support.microsoft.com/kb/139444/zh-cn

以下是根据官方说明写的一个示例

--创建一个表,假设col1和col2两列的组合应该惟一,但是现在有重复键,我们的目的就是去除重复行
create table t1(
col1 int,
col2 int,
col3 char(50)
)

insert into t1
select 1, 1, 'data value 1' union all
select 1, 1, 'data value 1' union all
select 1, 1, 'data value 1' union all
select 1, 2, 'data value 2' union all
select 1, 3, 'data value 3-1' union all
select 1, 3, 'data value 3-2' union all
select 1, 3, 'data value 3-3' union all
select 1, 4, 'data value 4' union all
select 1, 5, 'data value 5' union all
select 1, 6, 'data value 6-1' union all
select 1, 6, 'data value 6-2' union all
select 1, 7, 'data value 7' union all
select 1, 8, 'data value 8'

--看一下表可以发现,(1,1),(1,3),(1,6)有重复
select * from t1

--选择重复的键值放入临时表中
SELECT col1, col2, col3=count(*)
INTO holdkey
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1

--查看表holdkey
select * from holdkey

--结果如下,可知(1,1)重复行为3行,同理(1,3)为3行,(1,6)为2行
col1        col2        col3       
----------- ----------- -----------
          1           1           3
          1           3           3
          1           6           2

(所影响的行数为 3 行)

--选择重复的行放入临时表中,以清除进程中的重复值。例如:
SELECT DISTINCT a.*
INTO holddups
FROM t1 a inner join holdkey b
on (a.col1 = b.col1 AND a.col2 = b.col2)

--查看holddups表
select * from holddups

col1        col2        col3                                              
----------- ----------- --------------------------------------------------
          1           1 data value 1                                     
          1           3 data value 3-1                                   
          1           3 data value 3-2                                   
          1           3 data value 3-3                                   
          1           6 data value 6-1                                   
          1           6 data value 6-2                                   

(所影响的行数为 6 行)

--查询是否存在键重复而行唯一的情况
SELECT col1, col2, count(*) as 行数
FROM holddups
GROUP BY col1, col2

--结果如下,可见(1,3),(1,6)都在键重复但是行惟一的情况
--因为行数列全为1才是正常的
col1        col2        行数         
----------- ----------- -----------
          1           1           1
          1           3           3
          1           6           2

(所影响的行数为 3 行)  

--下面要修改holddubs表,将同一键值,但是第三列不同的情况删除。保证不同键值时行一定惟一
delete holddups
where col3 in
('data value 3-2','data value 3-3','data value 6-2')

--再查询holddups,看是否正常
select * from holddups

SELECT col1, col2, count(*) as 行数
FROM holddups
GROUP BY col1, col2

--结果为下,行数全为1,说明是正常的了
col1        col2        行数         
----------- ----------- -----------
          1           1           1
          1           3           1
          1           6           1

(所影响的行数为 3 行)

--从原始表中删除重复的行
DELETE t1
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2

--将惟一行放回原始表
INSERT t1 SELECT * FROM holddups

--查看原始表
select * from t1

--结果如下,可见重复键的列已没有了
col1        col2        col3                                              
----------- ----------- --------------------------------------------------
          1           1 data value 1                                     
          1           3 data value 3-1                                   
          1           6 data value 6-1                                   
          1           2 data value 2                                     
          1           4 data value 4                                     
          1           5 data value 5                                     
          1           7 data value 7                                     
          1           8 data value 8                                     

(所影响的行数为 8 行)