ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 转贴:判断是否存在记录

转贴:判断是否存在记录

原创 Linux操作系统 作者:orchidllh 时间:2005-02-24 00:00:00 0 删除 编辑

原来以为自己看懂且记住了,到要用的时候才发现不是那么回事,所以还是转贴到这里,方便我查询吧。

原作是oldwain

http://blog.itpub.net/post/6/9018


很多人喜欢用:

select count(*) into t_count from t where condition;
if t_count> 0 then ....

这种方法的问题在于:我们需要的仅仅是是否存在,而不是得到总记录数。查询记录总数付出了不必要的性能代价。


两种情况:


1. 如果判断是否存在记录后, 要查询记录中的某些列的信息,或者是决定要对表进行insert/update操作,典型的操作为:
a.
select count(*) into t_count from t where condition;
if t_count> 0 then
 select cols into t_cols from t where condition;
else
 otherstatement;
end;
b. 
select count(*) into t_count from t where condition;
if t_count> 0 then
 update ...;
else
 insert ...;
end;

这两种操作,都可以采用直接操作,然后进行例外处理的方式,根本就不进行这个存在性判断!

改写后的a. 
begin
 select cols into t_cols from t where condition;
exception
 when no_data_found then begin
     statement-block2;
 end;
 when others then begin
  raise error...
 end;
end;

改写后的b.

update t set ... where condition;
IF SQL%NOTFOUND THEN
 insert into t ...
END IF;
或者:
begin
 insert into t ...
exception
 when DUP_VAL_ON_INDEX then begin
     update t set ...
 end;
end;

这两种方法使用哪一种,取决于你认为哪种情况出现的可能更高。

2. 如果判断是否存在记录来决定是否进行其它操作, 如下例
select count(*) into t_count from t where condition;
if t_count> 0 then ....

则可以改成这样的语句:

select count(*) into t_count from dual where exists(select 1 from t where condition);
if t_count> 0 then ....

使用改写后的语句,多数情形下应该会有比原来的语句更好的性能。(当然, 如果你要查询的表本身是一个单行或只有几行记录的表, 直接查询应该会更好)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/51862/viewspace-180603/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-02-21

  • 博文量
    180
  • 访问量
    843985