How do I convert these SQL statements into more efficient statements

て烟熏妆下的殇ゞ 提交于 2020-04-17 22:45:57

问题


I have the following code:

  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;

I am not sure if I can convert this code to MERGE statement or anything more efficient, if YES, could anyone please help me in converting this code.

Thanks in advance for your time and help!


回答1:


You can create only one cursor and join this two tables. Then if I understood you correctly you can update table_X if there is any data in this cursor.

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;
/

Here is a small demo




回答2:


You can do it all in a single a UPDATE statement using NOT EXISTS clause:

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



来源:https://stackoverflow.com/questions/60569569/how-do-i-convert-these-sql-statements-into-more-efficient-statements

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!