我不能为我的生活弄清楚我做错了什么。我有两个表,其中一个列表包含要查找的ID号,另一个表包含节点和节点的响应。我正在检查是否在一个表中注册了一个具有匹配id号的响应,两个表中都存在id号,但响应有记录或没有记录。预期的输出很简单:
id_num rec_exists
______ __________
000123 Y
000124 N
...
这是我的代码:
set serveroutput ON
DECLARE
CURSOR c1 IS
SELECT id_num
FROM pcnodes;
i NUMBER := 0;
rec_exists CHAR(20);
b CHAR(20);
BEGIN
FOR e_rec IN c1 LOOP
i := i + 1;
SELECT CASE
WHEN EXISTS (SELECT *
FROM computer_node a,
node_response b
WHERE id_num IN ( e_rec ))
THEN 'Y'
ELSE 'N'
END AS rec_exists
FROM dual;
dbms_output.Put_line(i
||Chr(20)
||e_rec.id_num
||Chr(20)
||rec_exists);
END LOOP;
END;
答案 0 :(得分:0)
我认为这个查询会给你的结果没有光标:
select nvl(a.id_num, b.id_num) as id, nvl2(p.id_num,'Y','N')
from node_response b
full outer join computer_node a on (a.id_num = b.id_num)
left outer join pcnodes p on (p.id_num = nvl(a.id_num, b.id_num));
FROM computer_node a, node_response b
没有意义这是交叉连接。如果您要检查至少其中一个表中是否存在ID,请使用上面的full join
。如果id_num
仅在其中一个表中,请使用如下所示的单个表:
select b.id_num, nvl2(p.id_num,'Y','N')
from node_response b
left outer join pcnodes p on (p.id_num = b.id_num;
答案 1 :(得分:0)
存在多个问题。
首先:您应该将案例结果保存到变量中,缺少INTO
SELECT CASE
WHEN EXISTS (SELECT *
FROM computer_node a,
node_response b
WHERE id_num IN ( e_rec ))
THEN 'Y'
ELSE 'N'
END AS rec_exists
INTO rec_exists
FROM dual;
第二:您在查询中使用了两个表,只有一个条件,不确定是否有意。如果两个表都有id_num
列,那么您应该将其添加到您的条件
SELECT *
FROM computer_node a,
node_response b
WHERE a.id_num = e_rec
AND b.id_num = a.id_num
或类似的东西,取决于你的表
但是你可以在单个查询中完成所有这些操作,不需要游标循环,然后在
中进行另一个查询