首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么用 not exists 查询第三行记录

2012-01-28 
如何用 not exists 查询第三行记录table:stunameagejac20tom30irs25要求不用临时表。我要查出第三条,我使用

如何用 not exists 查询第三行记录
table:   stu

name       age

jac         20
tom         30
irs         25

要求不用临时表。

我要查出第三条,我使用
  select   top   1   *   from   stu   where   name   not   in   (select   top   2   name   from   stu)  

得到:   irs       25

据说,使用   not   exists   性能会好一些,我该如何修改呢??

谢谢了

[解决办法]
select top 1 * from stu where not exists(select top 2 name from stu)
[解决办法]
沒有太大的差距的說...
[解决办法]
playwarcraft(时间就像乳沟,挤挤还是有的) ( ) 信誉:100 Blog 加为好友 2007-04-05 08:22:53 得分: 0


沒有太大的差距的說...


------------

他這種情況,可以用exists寫出來,得到他的結果?
[解决办法]
to楼主:
请问‘第三条’,怎么个‘第三’?没有一个排序的规则么?
如果就按照你所给的那条来看,效率倒是没问题。
[解决办法]
create table stu(name varchar(10),age int)
insert into stu
select 'jac ',20 union all
select 'tom ',30 union all
select 'irs ',25

--cost 42.51%
select top 1 * from stu where name not in (select top 2 name from stu)
/*
name age
---------- -----------
irs 25
*/

--cost 47.71%
select * from stu where not exists(select 1 from (select top 2 name from stu) t where name=stu.name)
/*
name age
---------- -----------
irs 25
*/

drop table stu

--------------------------------------------
以上2種對比not in 42.51% ,not exists 47.71%,前者還好點呢
[解决办法]
--重來:)
-- 0.00%
create table stu(name varchar(10),age int)

--17.46%
insert into stu
select 'jac ',20 union all
select 'tom ',30 union all
select 'irs ',25 union all
select 'alen ',10 union all
select 'dav ',60

--38.77%
select top 1 * from stu where name not in (select top 2 name from stu)
/*
name age
---------- -----------
irs 25
*/

--43.78
set rowcount 1
select * from stu where not exists(select 1 from (select top 2 name from stu) t where name=stu.name)
set rowcount 0
/*
name age
---------- -----------
irs 25
*/


drop table stu
-------------------------------------------------------

[解决办法]
有區別嗎?
[解决办法]
据说,使用 not exists 性能会好一些,我该如何修改呢??

not in 与 not exists
不是所有的语句都会性能好

楼主以上用法用not in会好点:
没有排序规则的情况下,可以用下面方法:
declare @ta table (name varchar(10),age int)
insert into @ta
select 'jac ',20 union all
select 'tom ',30 union all
select 'irs ',25 union all
select 'alen ',10 union all
select 'dav ',60

select top 1 * from @ta where
binary_checksum(*) not in (select top 2 binary_checksum(*) from @ta)




(5 行受影响)
name age
---------- -----------
irs 25

(1 行受影响)


[解决办法]
top 1--这已经是一个条件了,如果没有这个条件用not exists性能会比not in 好
[解决办法]
select top 1 * from stu
left join (select top 2 [name] from stu) a
on stu.[name]=a.[name]
where a.[name] is null
[解决办法]
兄弟:
任何关键字不存在那个快那个慢. 用对地方它就快.用不对就慢.
象你这种情况,肯定要用not in, 对效率的理解不能生般硬套.

[解决办法]
"not exists 比 not in慢 "
----个人认为,它本身就是个错误的概念. 因为它们是两码事的查询逻辑.
只能说该用not exists的时候用了not in 速度就慢.

热点排行