2016-12-13 15 views
0

私の人生にとって私は間違っていることを理解できません。ルックアップするID番号のリストと、ノードからの応答とノードからの応答を持つ2つのテーブルがあります。私は、ID番号が一致する1つのテーブルに応答が登録されているかどうかを確認していますが、ID番号は両方のテーブルに存在しますが、応答にはレコードがあるかどうかが確認されます。予想される出力は単純です:ここでOracle PLSQLカーソルネストされた選択ケース

id_num   rec_exists 
______   __________ 
00Y 
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

あなたもエラーを投稿してください。 – Kacper

答えて

0

は複数の問題があります。id_num場合、これらのテーブルのいずれかが、下記のような単一のテーブルを使用するだけです。

まず:あなたは

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; 

第二INTO行方不明、変数にあなたのケースの結果を保存する必要があります:あなたはあなたのクエリに2つのテーブルと1つの条件のみを使用している、わからないことが意図されていました。両方のテーブルは、id_num列を持っている場合は、あなたのテーブルの上に

を依存し、あなたの状態

SELECT * 
FROM computer_node a, 
    node_response b 
WHERE a.id_num = e_rec 
    AND b.id_num = a.id_num 

またはそのような何かにそれを追加する必要がありますしかし、あなたは、単一のクエリでカーソルループの必要性をすべてこれを行うことはできませんそしてもう1つ質問があります

+0

[古いスタイルのJOINを使用するバッド習慣](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - ANSI - ** 92 ** SQL標準(* ** 20年以上前**)のold * style *カンマ区切りのテーブル*スタイルのリストが*適切な* ANSI 'JOIN'構文に置き換えられましたその使用はお勧めしません。 –

+0

私は同意します、それは私のquerryではなく、著者のちょうどc/pです。彼はそれがそのように好きなら、誰が私は裁判官です:) – BeRightBack

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が、これはクロス参加さ意味をなさない。これらのテーブルの少なくとも1つにidが存在するかどうかを確認する場合は、上記のようにfull joinを使用してください。

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; 
関連する問題