connect by 쿼리 질문 드립니다. 0 1 1,500

by rmsja10 [SQL Query] [2013.10.03 10:21:30]


1.png (19,571Bytes)
2.png (28,480Bytes)


SELECT
    A.rnum,
    A.lev as "level",
    A.subj_seq,
    A.subject,
    A.subj_ord,
    A.up_subj_seq,
    A.stat,
    A.mod_dt,
    A.mod_id,
    A.mod_ip,
    A.reg_dt,
    A.reg_id,
    A.reg_ip,
    A.cont,
    A.read_cnt,
    A.doc_seq,
    A.verify_yn,
    A.verify_id,
    A.real_nm_yn,
    A.verify_dt,
    A.str_pg,
    A.end_pg,
    A.avgPoint,
    A.opinionCount,
    LAG (A.subj_seq) OVER (PARTITION BY A.up_subj_seq ORDER BY A.rnum) as pre_subj_seq,
    LEAD (A.subj_seq) OVER (PARTITION BY A.up_subj_seq ORDER BY A.rnum) as next_subj_seq
    FROM
    (
    SELECT
    rownum as rnum,
    level as lev,
    subj_seq,
    subject,
    subj_ord,
    up_subj_seq,
    stat,
    mod_dt,
    mod_id,
    mod_ip,
    reg_dt,
    reg_id,
    reg_ip,
    cont,
    read_cnt,
    doc_seq,
    verify_yn,
    verify_id,
    real_nm_yn,
    verify_dt,
    str_pg,
    end_pg,
    (SELECT nvl(round(avg(point),1),0) FROM subject_point B WHERE B.doc_seq = doc_seq and B.subj_seq = subj_seq) as avgPoint,
    (SELECT count(*) FROM subject_opinion B WHERE B.doc_seq = doc_seq and B.subj_seq = subj_seq) as opinionCount
    FROM subject
    WHERE doc_seq = 1 and stat='R'
    START WITH up_subj_seq is null 
    CONNECT BY prior subj_seq = up_subj_seq
    ORDER SIBLINGS BY subj_ord
    ) A
    ORDER BY rnum;

현재 쿼리는 위와 같구요. DB를 잘 안써서... 공부하면서 했는데 잘 안되네요. 먼저 connect by 써서 계층형으로 뽑고
그상태에서 lag ,lead 함수를 쓰게되면 order siblings 쓰게되면 안먹더라구요. 정렬 때문이라고 나와서...
서브로 connect by 절을 두고 했습니다.
일단 이렇게 사용하는게 맞는지도 궁금하구요.

추가로 여기서 connect by 절에서 where 에 조건을 사용할 경우 결과가 이상해지더라구요...

위에보면 조건이 두개가 있는데요. 저부분만 조건을 추가 할 경우; 하위 애들이 중복으로 출력되버립니다...

그래서 아무렇게나 해보다가 start with 절에 where절에 적은 조건을 똑같이 옮겨서 적을 경우

정상출력이 되더라구요. 구글링을 해봐도 이렇게 사용하란 글이 없는데... 왜 이렇게 뜨나

쿼리를 잘못짠건가 싶어서.. 문의드려요. connect by 를 사용 할 경우 where 조건은 어디에 넣어야하나요?
by 마농 [2013.10.04 08:26:25]

계층구조쿼리에서 조건절이 들어가는 위치는 3군데 입니다.
이 때 중요 포인트는 각각의 조건이 수행되는 순서입니다.
1. Start With : 계층구조의 시작 조건
2. Connect By : 계층구조의 전개 조건
3. Where : 계층구조 전개 후 필터 조건
눈여겨 볼 것은 Where 절이 가장 나중에 수행된다는 것이죠.
단 where 절의 조건중 조인 조건은 가장 먼저 수행됩니다.(Start With 전에 수행)
각각의 조건이 의미하는 바를 정확히 알고 어디에 조건을 추가해야 할지를 잘 판단하셔야 합니다.


예를 들어 해당 조건이 전체 자료에 해당하는 조건이라면?
Start With 절과 Connect By 절에 모두 적용시켜야 합니다.
공통코드 테이블에서 코드구분 조건을 줄때가 이에 해당하지요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입