如何用 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 速度就慢.