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

时间:2015-01-27 16:11:20

标签: oracle syntax cursor

作为我的非技术团队的POC,我需要提出几种方法来做同样的事情,即检查一个表中的记录是否存在于另一个表中,以便查看哪个是最有效的。我想出了另外两种方法,我肯定会比光标更有效,但我仍然需要显示在光标中执行此操作所需的时间。然而,我无法弄清楚语法。

我有两张桌子:

表1有两个我需要的字段,我将获取光标中的变量:

Field = ID 字段=帐号

表2有我需要的一个字段:

字段=帐号(无可用ID)

我需要表1中的ID以及表1中的帐号不在表2中的交易计数。有任何建议吗?

2 个答案:

答案 0 :(得分:1)

鉴于样本数据:

SQL> SELECT * FROM T1;
 ID 
 -- 
  1 
  2 
  3 

SQL> SELECT * FROM T2;
 ID 
 -- 
  2 
  3 
  4 

执行anti-join 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; 

答案 1 :(得分:0)

我不确定我是否关注过您,但简单的游标可能如下所示:

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;