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,还是其他什么的都一样的.