Как мне преобразовать эти SQL заявления в более эффективные заявления - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующий код:

  CURSOR Q1 IS
    SELECT COL1, COL2, COL3, COL4, COL5, COL6 FROM TABLE1;

  CURSOR Q2 IS
    SELECT COL11, COL22, COL33, COL44, COL55, COL66 FROM TABLE2;

  PRESENT BOOLEAN;

   FOR X IN Q1 LOOP
     PRESENT := FALSE;
     FOR Y IN Q2 LOOP
      IF (X.COL3 = Y.COL33) AND (X.COL4 = Y.COL44) THEN
        PRESENT := TRUE;
        EXIT;
      END IF;
     END LOOP;

     IF NOT PRESENT THEN
        UPDATE TABLE_X SET COL_A = 'Y';
        COMMIT;
     END IF;
   END LOOP;

Я не уверен, смогу ли я преобразовать этот код в оператор MERGE или что-нибудь более эффективное, если ДА, может кто-нибудь помочь мне преобразовать этот код.

Заранее спасибо за ваше время и помощь!

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вы можете создать только один курсор и объединить эти две таблицы. Тогда, если я вас правильно понял, вы можете обновить table_X, если в этом курсоре есть какие-либо данные.

declare 

CURSOR Q1 IS
SELECT count(X.COL1)
FROM TABLE1 X
join TABLE2 Y
on X.COL3 = Y.COL33 AND X.COL4 = Y.COL44;

v_Q1 int := 0;

begin

open Q1;
fetch Q1 into v_Q1;
close Q1;

If v_Q1 > 0 then
   UPDATE TABLE_X SET COL_A = 'Y';

end if;

end;
/

Вот небольшая демонстрация

0 голосов
/ 06 марта 2020

Вы можете сделать все это в одном операторе UPDATE, используя предложение NOT EXISTS:

UPDATE TABLE_X
SET COL_A = 'Y'
WHERE NOT EXISTS (
  SELECT 1
  FROM   TABLE1 x
         INNER JOIN TABLE2 y
         ON ( x.COL3 = y.COL33 AND x.COL4 = y.COL44 )
);

db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...