繁体   English   中英

Oracle:使用游标检查一个表中的记录是否存在于另一个表中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM