by hy [Oracle 기초] 오라클 서브쿼리 START WITH [2017.02.07 15:17:02]
안녕하세요 :D
오라클 입문자입니다.
제가 못해서 못하는건지, 아니면 안되는걸 되게하려고 하는건지 몰라 질문드립니다.
오라클를 SELECT에서 서브쿼리 작성할때 서브쿼리안에 MIN() KEEP FROM (START WITH ~ CONNECT BY ~) 쿼리가 있으면 안되는건가요..?
제 생각에 이론적으론 가능할것같은데.. A.CODE - ORA-00904: 부적합한 식별자 <- 라는 오류가 납니다..
제가 쉬운길을 돌아가려고 하는건지 잘 모르겠네요 ㅠ
예)
SELECT ID, NAME, (
SELECT MIN(PATH) KEEP(DENSE_RANK FIRST ORDER BY ROWNUM ASC) PATH
FROM (
SELECT ROWNUM, PATH
FROM TEST_TABLE2 ST
START WITH ST.CODE = A.CODE
CONNECT BY PRIOR CODE = PARENTCODE
ORDER BY SIBLINGS BY ORDER ASC
) MIN_PATH
) from TEST_TABLE A
ORDER BY ORDER ASC
+ 오라클 초급, 중급 서적 추천해주시면 감사하겠습니다. (_ _)
답변 감사합니다 :D
=========================================
메뉴테이블
컬럼: 메뉴코드, 부모메뉴코드, 메뉴뎁스, 메뉴명, 메뉴경로
=========================================
위의 메뉴테이블 구조에서 현재는 4뎁스까지 있는 메뉴구조입니다.
1뎁스 메뉴를 모두 조회하면서, 해당 메뉴의 하위 메뉴들 중 첫번째 경로를 가져오려고 합니다.
예)
1뎁스 | 2뎁스 | 3뎁스
회원관리(경로: NULL) - | - 통계관리(경로: NULL) - | - 로그인통계(경로: A)
| | - 가입통계(경로: B)
| - 매출관리(경로: C)
제품관리(경로: NULL) - | - 제품등록(경로: D)
...
위와같은 데이터가 저장되어있을때 결과화면
-> 메뉴코드, 회원관리, 경로A
메뉴코드, 제품관리, 경로D
....
부가적으로 관리자 계정 및 권한을 조회하고있습니다 :)
SELECT id , name , (SELECT path FROM test_table2 st WHERE path IS NOT NULL AND ROWNUM = 1 START WITH st.code = a.code CONNECT BY PRIOR code = parentcode ORDER BY SIBLINGS BY order ) min_path FROM test_table a ORDER BY order ;
음. 테스트 안해보고 올렸네요.
역시나.. 테스트 해보니 Order Siblings By 구문 때문에 에러나네요.
이 댓글은 일단 무시해 주세요. ^^a
ORDER BY 에 ORDER가 있는데 컬럼명이 정확히 뭐죠?? 첫번째 메뉴를 선택할 때 사용하는 컬럼인 것 같은데..
저도 일단 한번 올려봅니다.
SELECT A.CODE, B.LEAF FROM TEST_TABLE A, ( SELECT ROOT, MIN(메뉴경로) KEEP(DENSE_RANK FIRST ORDER BY ORD) LEAF FROM ( SELECT CONNECT_BY_ROOT(CODE) ROOT, CODE, ORD, 메뉴경로 FROM TEST_TABLE2 WHERE CONNECT_BY_ISLEAF = 1 CONNECT BY NOCYCLE PRIOR CODE = PARENTCODE ) GROUP BY ROOT ) B WHERE A.CODE = B.ROOT
SELECT a.id , a.name , b.min_path FROM test_table a , (SELECT code , MIN(path) KEEP(DENSE_RANK FIRST ORDER BY rn) min_path FROM (SELECT CONNECT_BT_ROOT(code) code , ROWNUM rn , path FROM test_table2 WHERE path IS NOT NULL -- WHERE CONNECT_BY_ISLEAF = 1 START WITH lvl = 1 CONNECT BY PRIOR code = parentcode ORDER BY SIBLINGS BY order ) GROUP BY code ) b WHERE a.code = b.code ORDER BY a.order ASC ;