重复记录-查找

作者:leen 来源:ITPOW(原创) 日期:2006-12-19

我们定义的重复记录并不是两条记录完全相同,而是全部或部分字段内容相同,至于哪些字段相同就定义为重复记录,完全是由我们自己决定。

要最简单最高效地发现重复记录,每一条记录应该有自身的标识,我们通常用主键作为标识,比如我们常说的“记录ID”。

建立一个表,并插入几条记录,如下:

if exists(select name from sysobjects where name='foo' and xtype='U')
    drop table [foo]
go

create table [foo]
(
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [sName] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [sClass] [char] (2) COLLATE Chinese_PRC_CI_AS NOT NULL
) on [PRIMARY]
go

insert into foo(sName, sClass) values('张三', '1')
insert into foo(sName, sClass) values('李四', '1')
insert into foo(sName, sClass) values('李四', '2')
insert into foo(sName, sClass) values('王五', '2')
insert into foo(sName, sClass) values('王五', '2')
insert into foo(sName, sClass) values('王五', '2')

我们定义:sName 与 sClass 相同即为重复记录,可以看出,第四、五、六条记录重复。

那么如何找出这些重复记录呢?

select L.* from foo L inner join foo R on L.id<>R.id and L.sName=R.sName and L.sClass=R.sClass

将表 foo 看作两个表:L 和 R,使用内联接选取重复记录,L.id<>R.id 表示不是同一条记录,L.sName=R.sName and L.sClass=R.sClass 表示定义为重复的条件。

列表结果我们可能会发现有些记录显示了多次,不便于观察,我们可以过滤。

select distinct * from (
select L.* from foo L inner join foo R on L.id<>R.id and L.sName=R.sName and L.sClass=R.sClass) a

将结果看成一个表 a,再用 distinct 过滤。

相关文章