[英]Oracle: Use a cursor to check whether a record in one table exists in another
作为我的非技术团队的POC,我需要想出几种方法来做同一件事,即检查一个表中是否存在另一个表中的记录,以查看哪个表最有效。 我想出了另外两种方法,我肯定会比游标更有效,但是我仍然需要在游标中显示执行此操作所需的时间。 我无法弄清楚语法。
我有两个表:
表1有我需要的两个字段,并且正在读取游标中的变量:
字段= ID字段=帐号
表2有一个我需要的字段:
字段=帐号(无可用ID)
我需要表1中的ID和表1中未包含表1中的帐号的交易次数。有什么建议吗?
鉴于该示例数据:
SQL> SELECT * FROM T1;
ID
--
1
2
3
SQL> SELECT * FROM T2;
ID
--
2
3
4
执行反联接T1▷T2的正确方法是:
SQL> SELECT ID FROM T1 WHERE ID NOT IN (SELECT ID FROM T2);
ID
--
1
现在,如果要使用游标来显示速度有多慢,则可能需要使用两个嵌套循环,如以下示例所示:
DECLARE
CURSOR c1 IS (SELECT ID FROM T1);
r1 c1%ROWTYPE;
CURSOR c2 IS (SELECT ID FROM T2);
r2 c2%ROWTYPE;
BEGIN
FOR r1 IN c1
LOOP
FOR r2 IN c2
LOOP
IF (r1.ID = r2.ID)
THEN
-- continue to the next iteration of the outer loop
-- as we have a match
GOTO continue;
END IF;
END LOOP;
-- we can only reach that point if there was no match
DBMS_OUTPUT.PUT_LINE(TO_CHAR(r1.ID));
<<continue>>
NULL;
END LOOP;
END;
我不确定是否跟随您,但是一个简单的光标可能看起来像这样:
DECLARE
v_id NUMBER;
v_acct NUMBER;
BEGIN
FOR r1 IN ( SELECT ID, ACCT_NBR
FROM table1 T1
WHERE NOT EXISTS ( SELECT 1 FROM table2
where ID = T1.ID )
) LOOP
v_id := r1.id;
v_acct := r1.acct_nbr;
-- do something
END LOOP;
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.