存在vs选择计数

Vic*_*tor 1 sql-server oracle plsql

在SQL Server中,性能明智,使用IF EXISTS (select * ...)IF (select count(1)...) > 0... 更好.

但是,看起来甲骨文不允许EXISTSIF声明中,这样做会有什么替代方法,因为使用IF select count(1) into...效率非常低效?

代码示例:

IF (select count(1) from _TABLE where FIELD IS NULL) > 0 THEN
UPDATE TABLE _TABLE
SET FIELD = VAR    
WHERE FIELD IS NULL;
END IF;
Run Code Online (Sandbox Code Playgroud)

Daz*_*zaL 6

编写代码片段的最佳方法是

UPDATE TABLE _TABLE
SET FIELD = VAR    
WHERE FIELD IS NULL;
Run Code Online (Sandbox Code Playgroud)

即只是做更新.它会处理行还是不处理.如果你需要检查它是否确实处理了行,那么之后再添加

if (sql%rowcount > 0)
then
...
Run Code Online (Sandbox Code Playgroud)

通常在你有逻辑的情况下

declare
  v_cnt number;
begin
select count(*) 
  into v_cnt 
  from TABLE 
 where ...;

if (v_cnt > 0) then..
Run Code Online (Sandbox Code Playgroud)

最好使用ROWNUM = 1,因为如果有4000万行你就不要关心.只有在找到1行后Oracle才会停止.

declare
  v_cnt number;
begin
select count(*) 
  into v_cnt 
  from TABLE 
 where rownum = 1
   and ...;

if (v_cnt > 0) then..
Run Code Online (Sandbox Code Playgroud)

要么

select count(*) 
  into v_cnt 
  from dual
 where exists (select null 
                 from TABLE
                where ...);
Run Code Online (Sandbox Code Playgroud)

你喜欢哪种语法.