`

有重复数据时只显示一条记录

Go 
阅读更多
if not object_id('tempdb..#T') is null --判断是否存在临时表#T
drop table #T --如果存在则删除
go

create table #T   --#T是一个临时表,创建存储在系统数据库的tempdb数据库中,用了以后重启数据库服务就会释放.
(
	[id] int,
	[name] varchar(1),
	[memo] varchar(2)
)
go

select * from #T
go

insert into #T
select 1,N'A',N'A1' union all
select 2,N'A',N'A2' union all
select 3,N'A',N'A3' union all
select 4,N'B',N'B1' union all
select 5,N'B',N'B2'
go

select * from #T a where not exists (select 1 from #T where [name]=a.[name] and id<a.id)
--这里的select 1 代表的是一个常量,因为exists返回的是一个boolean值,所以只要一个值就可以了,也就是说也可以是select 2 select 3

 

  该语句执行过程:

  首先要知道not exists是不存在的意思

  比如定位到 1,N'A',N'A1' 时,在表里找到name='A',并且不存在id比这条记录还小的记录就返回真.显然这个满足

   以下两条不满足,因为name='A'时,还有一个id=1

   2,N'A',N'A2'  

   3,N'A',N'A3'

 

  这些语句都是取Name相同ID最小的记录(推荐用1,2,3),方法3在SQL05时,效率高于1、2

 

    方法2:自联接的方式

select a.* from #T a join (select min(id) id,[name] from #T group by [name])b 
on a.id=b.id and a.[name]=b.[name]

 

    方法3:

select * from #T a where id=(select min(id) from #T where a.[name]=[name])

 

    方法4:

select a.* from #T a join #T b on a.[name]=b.[name] and a.id>=b.id   
group by a.[name],a.id,a.memo having count(1)=1   
  
--取自连接分组后总记录数为1的结果   
--having就是对GROUP BY 进行筛选.   
--having count(1)=1 筛选出总记录数为1的数据.   
--join就是inner join    
--count(1)=1 就相当于count(*)=1,count()里面用什么都一样的,不管是某个
--表中存在的字段,还是*,还是1,还是其他什么的都一样的.  

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics