作为我的非技术团队的POC,我需要提出几种方法来做同样的事情,即检查一个表中的记录是否存在于另一个表中,以便查看哪个是最有效的。我想出了另外两种方法,我肯定会比光标更有效,但我仍然需要显示在光标中执行此操作所需的时间。然而,我无法弄清楚语法。
我有两张桌子:
表1有两个我需要的字段,我将获取光标中的变量:
Field = ID 字段=帐号
表2有我需要的一个字段:
字段=帐号(无可用ID)
我需要表1中的ID以及表1中的帐号不在表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;