Как преобразовать эти операторы SQL в более эффективные операторы

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

  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 или что-то более эффективное, если ДА, может ли кто-нибудь помочь мне в преобразовании этого кода.

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


person xpetta    schedule 06.03.2020    source источник
comment
Можете ли вы предоставить образцы данных, желаемые результаты и объяснение логики, которую вы хотите выполнить. Сколько строк у table_x? Почему вы устанавливаете их все на одно и то же значение?   -  person Gordon Linoff    schedule 06.03.2020
comment
Вы (потенциально) обновляете все строки TABLE_X на каждой итерации цикла (в вашем UPDATE нет предложения WHERE), действительно ли это то, что вы хотите?   -  person GMB    schedule 06.03.2020


Ответы (2)


Вы можете создать только один курсор и соединить эти две таблицы. Тогда, если я вас правильно понял, вы можете обновить 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;
/

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

person VBoka    schedule 06.03.2020
comment
Я смог решить проблему с помощью вашего решения. Большое спасибо :) - person xpetta; 08.03.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‹>скрипка

person MT0    schedule 06.03.2020