澳门新葡萄京官网首页重复记录-查找

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

关于with ties



对于with ties一般是和Top , order
by相结合使用的,会查询出最后一条数据额外的返回值返回了前面n个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值相同,则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值)。

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

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

实验:

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

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)

实验用表:复制代码 代码如下:CREATE TABLE
[dbo].[PeopleInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [name]
[nchar]澳门新葡萄京官网首页,(10) COLLATE Chinese_PRC_CI_AS NULL, [numb] [nchar](10)
COLLATE Chinese_PRC_CI_AS NOT NULL, [phone] [nchar](10) COLLATE
Chinese_PRC_CI_AS NULL ) ON [PRIMARY]向表中插入数据:复制代码 代码如下:insert into
peopleinfo([name],numb,phone) values (‘李欢’,’3223′,’1365255′) insert
into peopleinfo([name],numb,phone) values (‘李欢’,’322123′,’1′) insert
into peopleinfo([name],numb,phone) values
(‘李名’,’3213112352′,’13152′) insert into
peopleinfo([name],numb,phone) values
(‘李名’,’32132312′,’13342563′)查看插入的全部数据:复制代码 代码如下:select * from
dbo.PeopleInfo结果图:

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

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

操作步骤1:不用with ties

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

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

代码:复制代码 代码如下:select top 3 *
from peopleinfo order by [name] desc结果如图:

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

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

操作步骤2:用with ties

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’)

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

代码:复制代码 代码如下:select top 3 with
ties * from peopleinfo order by [name] desc结果如图:

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


如果with ties不与top和order by结合使用的错误示范:

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

操作步骤1:不与order by结合使用,只和top结合使用:

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

代码:复制代码 代码如下:select top 3 with
ties * from peopleinfo错误消息如图:

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

操作步骤2:不与top结合使用,只和order by结合使用:

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

代码:复制代码 代码如下:select with ties
* from peopleinfo order by [name] desc错误消息如图:

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

操作步骤3:不与top结合使用也不与order by结合使用:

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

代码:复制代码 代码如下:select with ties
* from peopleinfo 错误消息如图:

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

发表评论

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