START WITH 질문( 메뉴작업중입니다) 0 9 4,867

by 손님 [SQL Query] start with [2009.08.20 02:59:26]


SELECT * FROM
            (
                SELECT
                         DISTINCT(A.MENU_ID)
                        ,A.MENU_NM
                        ,A.MENU_URL
                        ,A.MENU_IMG
                        ,A.MENU_UP
                        ,B.MENU_GB
                        ,A.MENU_SEQ
                        ,B.USER_ID
                    
                FROM
                        RAY_T_MENU A
                        INNER JOIN RAY_T_MENUACCESS B
                        ON A.MENU_ID = B.MENU_ID
                        AND A.MENU_YN = 'Y'

                START WITH B.MENU_GB = 'T'
                CONNECT BY PRIOR A.MENU_ID = A.MENU_UP
                               
              ) WHERE USER_ID='action1020'
              

제가 구성한 방식의 메뉴입니다.  START WITH 라는 녀석을 알게되 사용하고자 하는데 원하는 결과를뽑기가

애매하네요. 현재 시간이 새벽3시인지라.. 여기 질문올리고 내일 출근을 위해.. 쉬어야할꺼같네요..

RAY_T_MENU 에는

MENU_ID,MENU_GB,MENU_UP,MENU_SEQ 등이 있습니다.

아이디, 메뉴구분(T- 탑, S - 서브, M - 미드 로 구분자를 넣어줍니다.) ,  상위메뉴의 아이디를 기억합니다.

정렬순서를 기억합니다. ( 순서대로 설명해드린거에요  ID,GB,UP,SEQ)


그리고 MENU_ACCESS 에는 MENU_ID, MENU_GB, USER_ID 가 있습니다.

상위쿼리를 돌리니 최상위인 'T' 가 여러개여서 그런지 결과값이 제대로 안나옵니다. (제가 잘못이해한건가요?)


T - 탑

S - 서브

M - 미드

T..

..S..

.....M 식으로 나오게 하려면 어찌해야할지 고민중입니다. 고수님들의 한수부탁드립니다.


서초 초보 프로그래머......


             

by 마농 [2009.08.20 08:28:14]
distinct 해서 그런거 아닌가요? 빼세요.

by 질문손님 [2009.08.20 10:27:00]
DISTINCT 를 빼면 중복된 로우가 주루룩 흘러나옵니다.

by 마농 [2009.08.20 10:56:10]
원 자료가 중복인가요? 아니면 조인하면서 중복자료가 생긴건가요?
메뉴구분은 b테이블에 있는건가요? a테이블에 있는 건가요? 아님 둘다 있는건가요?
중복자료를 우선 제거 하시고 계층쿼리를 사용해 보세요.
조인조건이 누락되거나 기타 다른 조건이 누락되어 중복이 발생한것이 아닌지부터 확인해 보세요.

by 마농님감사 [2009.08.20 11:45:02]
RAY_T_MENU 에는 메뉴정보들이 들어있습니다.
RAY_T_MENUACCESS 에는 메뉴접근제한정보가 들어있으며
구조는 MENU_ID 와 MENU_GB 와 사용자 아이디가 들어가 있습니다.

RAY_T_MENU 에등록된 메뉴정보를 기준으로 추출하려고 하는건데요.
잘 안되네요

by 마농 [2009.08.20 12:46:23]
글쎄요, 자료를 보지 않고서는 모르겠네요.

by 초보손님 [2009.08.20 16:37:32]
SELECT A.MENU_ID
,A.MENU_NM
,A.MENU_URL
,A.MENU_IMG
,A.MENU_UP
,A.MENU_SEQ
FROM RAY_T_MENU A
START WITH A.MENU_ID IN(SELECT MENU_ID FROM RAY_T_MENU WHERE MENU_GB = 'T')
CONNECT BY PRIOR A.MENU_ID = A.MENU_UP

이런형식으로 먼저 RAY_T_MENU T-탑 인 경우 먼저 가져와서
MENU_ACCESS 과 조인해 USER_ID를 가져오면 안될까 싶은 저의 생각입니다.

by 마농 [2009.08.20 16:53:44]
테이블 두번 읽는 서브쿼리를 할 필요 있나요?
start with menu_gb = 'T'
connect by prior menu_id = menu_up
order siblings by menu_seq
일단 메뉴 구성은 다음과 같겠구요.
이걸 인라인뷰로 해서 다른 테이블과 조인해 보세요.

번외로, menu_gb컬럼이 왜 양쪽 테이블에 다 있는지 의문이네요.

by 초보손님 [2009.08.20 17:04:47]
^^ 마농님 쿼리가 맞네요~~!!
저는 아직 멀었는가봐요 ㅜㅜ
먼저 메뉴 구성한다음 다른테이블에서 부가정보를 조인걸어서 가져오면 될꺼 같습니다. ^^;;

by 감사감사 [2009.08.20 17:54:56]
마농님 정말 완전 감사합니다. 그리고 초보손님의 답변역시 정말 감사합니다.
덕분에 해결되었으며, 해결 쿼리는 아래와 같습니다.

SELECT * FROM (
SELECT
A.MENU_ID
,A.MENU_NM
,A.MENU_URL
,A.MENU_IMG
,A.MENU_UP
,A.MENU_SEQ
,A.MENU_GB
FROM RAY_T_MENU A
START WITH MENU_GB='T'
CONNECT BY PRIOR A.MENU_ID = A.MENU_UP
ORDER SIBLINGS BY MENU_SEQ
) A
RIGHT OUTER JOIN RAY_T_MENUACCESS B
ON B.MENU_ID = A.MENU_ID
WHERE B.USER_ID = 'park'
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입