澳门新葡萄京官网首页 1

澳门新葡萄京官网首页重复记录-删除

  • 重复记录-查找
  • 重复记录-删除
  • 重复记录-避免
  • 重复记录-题外
  • 重复记录-查找
  • 重复记录-删除
  • 重复记录-避免
  • 重复记录-题外
  • 重复记录-查找
  • 澳门新葡萄京官网首页,重复记录-删除
  • 重复记录-避免
  • 重复记录-题外



仍然依照前一节的例子与思路,删除重复记录的语句如下:

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

既然我们不需要重复记录,就应该从一开始就避免其存在,可以在插入和更新之前判断是否存在,但更好的是利用
UNIQUE。

delete from foo where id in (select L.id from foo L inner join foo R on
L.id>R.id and L.sName=R.sName and L.sClass=R.sClass)

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

在企业管理器中,打开表设计,右键,索引/键,如图。

与查找重复记录的语句相比, L.id<>R.id 变成了
L.id>R.id,这是由于我们需要保留重复记录中的第一条记录。

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

这样,如果数据库中存在同样的目标记录,则插入或更新时就会失败。

同样 L.sName=R.sName and L.sClass=R.sClass 表示定义为重复的条件。

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

澳门新葡萄京官网首页 1

运行上述代码后,剩余记录如下:
id sName    sClass
1 张三       1
2 李四       1
3 李四       2
4 王五       2

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 过滤。

  • 重复记录-查找
  • 重复记录-删除
  • 重复记录-避免
  • 重复记录-题外

发表评论

电子邮件地址不会被公开。 必填项已用*标注