2016-12-13 2 views
0

내 인생에서 내가 잘못하고있는 것을 파악할 수는 없습니다. 조회 할 ID 번호 목록이있는 두 개의 표가 있고 노드의 노드와 응답이있는 다른 표가 있습니다. 응답이 하나의 테이블에 일치하는 ID 번호로 등록되어 있는지 확인하고 있는데, 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 누락 변수로 귀하의 케이스 결과를 저장해야합니다 : 당신이 당신의 쿼리에 두 테이블 만 하나 개의 조건을 사용하고, 확실하지 않은 그 의도되었다. 두 테이블이 id_num 열이있는 경우에, 당신은 당신의 테이블

을에 따라 당신의 상태에 그런

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

또는 어떤 것을 추가해야하지만, 단일 쿼리에 커서 루프에 대한 필요성이 모든 것을 할 수 없다 그 다음에 또 다른 쿼리가 있습니다

+0

[잘못된 습관 : 오래된 스타일의 조인 사용] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - ANSI - ** 92 ** SQL 표준에서 ** * ANSI'JOIN' 구문으로 구식 * 쉼표로 분리 된 테이블 * 스타일 목록이 * 20 년 전 **로 대체되었습니다. 그것의 사용은 낙심하지 않는다. –

+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

이 크로스가 조인 아무 의미가 없습니다. 위의 표 중 적어도 하나에 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;