1

SQL Serverでは、パフォーマンスの観点から、...IF EXISTS (select * ...)よりも使用する方が適切です。IF (select count(1)...) > 0

ただし、OracleはステートメントEXISTS内で許可していないようです。使用することはパフォーマンスの面で非常に非効率的IFであるため、これを行うための代替手段は何でしょうか。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;
4

2 に答える 2

6

コードスニペットを作成する最良の方法は

UPDATE TABLE _TABLE
SET FIELD = VAR    
WHERE FIELD IS NULL;

つまり、更新を行うだけです。行を処理するかどうかのどちらかです。行を処理したかどうかを確認する必要がある場合は、後で追加します

if (sql%rowcount > 0)
then
...

一般的にあなたがのようなロジックを持っている場合

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

if (v_cnt > 0) then..

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..

また

select count(*) 
  into v_cnt 
  from dual
 where exists (select null 
                 from TABLE
                where ...);

どちらの構文でも構いません。

于 2013-02-21T15:22:40.540 に答える
2

による:http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID : 3069487275935

あなたは試すことができます:

  for x in ( select count(*) cnt
               from dual 
              where exists ( select NULL from foo where bar ) )
  loop
        if ( x.cnt = 1 ) 
        then
          found do something
        else 
          not found
        end if;
  end loop;

は1つの方法です(非常に高速で、「必要な」場合にのみサブクエリを実行します。存在する場合は、最初の行にヒットした後にサブクエリを停止します)

group by句のないテーブルのcount(*)は、常に少なくとも1行とMOST 1行を返すため(テーブル自体も空です!)、このループは常に少なくとも1回、最大で1回実行されます。

于 2013-02-21T15:25:05.740 に答える