注册 登录
编程论坛 SQL Server论坛

in和exists例子

棉花糖ONE 发布于 2007-01-28 12:26, 1140 次点击

一个表中的某一列要重复数据,只要这些重复数据中的一个,表中有主键(或自增字段)
解决方法
if object_id('student') is not null
drop table student
go
create table student(id int identity,name varchar(1))
insert into student select 'a'
union all select 'a'
union all select 'b'
union all select 'b'

select * from student
结果
id name
----------- ----
1 a
2 a
3 b
4 b
select * from student where exists(select 1 from (select max(id) as id,name from student group by name) b where id=student.id)

结果
id name
----------- ----
2 a
4 b

select * from student where id in ( select id from (select max(id) as id,name from student group by name) b )

结果
id name
----------- ----
2 a
4 b

8 回复
#2
xu20002007-01-28 12:28
楼主觉得哪个快?
#3
棉花糖ONE2007-01-28 12:35

书上和csdn都说exist快,但是我不知道哪个快,没测试过,你有数据,可以去做过个测试,在公布结论吧

#4
xu20002007-01-28 13:00
我在Oracle8.05中测过,exists快。但sql中没试过。
#5
bygg2007-01-28 21:54
数据小时,两都差不多.
大的时候还是exists快.
#6
changjie2007-01-29 23:12
单多楼主这个例子所要结果来看,这个语句也可以得到相同的结果啊
select max(id),name from student
group by name


楼主这所语句有什么特殊利用场合吗, 下面这条语句还没有看明白,那个1还有b是从那来的,起什么作用 还请楼主帮忙解释下
select * from student where exists(select 1 from (select max(id) as id,name from student group by name) b where id=student.id)
#7
xu20002007-01-29 23:40
b是别名,1是随便打的。
#8
棉花糖ONE2007-01-29 23:43

多谢楼上的,每次遇到这种问题的时候都会忽略楼上的那种写法

exists后面跟的子查询只需判断出是true或者false所以用1是最简单的,也是最快的

(select max(id) as id,name from student group by name) b
这里的b就是代表前面的select语句产生的结果

#9
Kendy1234562007-01-30 11:09
当前台代码只想得到数据表结构时 也可以用select * from tablex where 1=2 返回空结果集.
1