세개의 테이블을 조인하는데... 1 9 5,665

by 볼우물 [2009.04.29 09:18:27]


SELECT M.MGR_ID 아이디, M.MGR_NAME 성명,
       M.MGR_DEP 소속부서, M.MGR_TELNO 전화번호,
       CASE WHEN SUBSTR(U.URL_ID,1,4) = 'IR01'  THEN '일반가상'
            WHEN SUBSTR(U.URL_ID,1,4) = 'IR12'  THEN '유동가상'
            WHEN SUBSTR(U.URL_ID,1,4) = 'IR09'  THEN '카드단말'
            WHEN SUBSTR(U.URL_ID,1,4) = 'IR03'  THEN '전자납부'
            WHEN SUBSTR(U.URL_ID,1,4) = 'IR04'  THEN '수납센터'
            WHEN SUBSTR(U.URL_ID,1,4) = 'IR08'  THEN '실적'
            WHEN SUBSTR(U.URL_ID,1,5) = 'IR025' THEN '과세'
            WHEN SUBSTR(U.URL_ID,1,5) = 'IR027' THEN '과오납'
            WHEN SUBSTR(U.URL_ID,1,5) = 'IR100' THEN '과표'
            WHEN SUBSTR(U.URL_ID,1,5) = 'IR105' THEN '기타'
        END AS 화면대분류,
       U.URL_NAME 화면명,
       S.SELECT_YN 조회, S.INSERT_YN 신규,
       S.UPDATE_YN 수정, S.DELETE_YN 삭제, PRINT_YN 출력
  FROM MANAGER_URL_TAB U,
       MANAGER_SECURITY_TAB S,
       MANAGER_TAB M
 WHERE U.URL_ID = S.URL_ID(+)
AND M.MGR_ID = S.MGR_ID
   AND M.MGR_ORG = '000'
   AND ((U.URL_ID NOT LIKE 'IR05%') AND       
        (U.URL_ID NOT LIKE 'IR06%') AND       
        (U.URL_ID NOT LIKE 'IR07%') AND        
        (U.URL_ID NOT IN ('IR039910')) AND    
        (U.URL_ID NOT LIKE 'IR08%'  OR        
         U.URL_ID IN ('IR080310', 'IR080320'))) 
 ORDER BY M.MGR_NAME, U.URL_SORT

 

 

위와 같은 쿼리가 있습니다.

그런데 보시는 바와 같이 MANAGER_TAB와 MANAGER_SECURITY_TAB는 컬럼

MGR_ID로 조인이 가능합니다. 그리고 MANAGER_SECURITY_TAB와 MANAGER_URL_TAB

는 URL_ID로 조인이 가능하고요. 문제는 저렇게 하면 SELECT_YN, DELETE_YN 등 조회나 삭제 수정 등등이

Y인 경우만 출력이 됩니다.

예를 들어 만일 자료에 MANAGER_TAB에 볼우물 이라는 사람이 있고

MANAGER_SECURITY_TAB에 화면 아이디가 0000과 1111이 있다고 하고

MANAGER_URL_TAB에는 0000, 11111, 2222이 있다고 치면

제가 뿌리고 싶은 화면이라면

이름      |  화면  |  조회 | 삭제

볼우물  |  0000 |  Y      |  Y

볼우물  | 1111 |  Y       |  Y

볼우물  | 2222 |           | 

이렇게 뿌리고 싶은데요..

조회나 삭제가 Y인것까지만 나오고 이게 널이면 나오질 않네요..

MANAGER_TAB에는 사용자 정보,

MANAGER_SECURITY_TAB에는 사용자에 따른 사용화면의 권한이 있습니다.

MANAGER_URL_TAB에는 모든 사용화면이 들어있구요.

쿼리에서 보시면 AND 절에 MGR_ORG = '000'으로 되어있는데 이것은

소속기관입니다.

즉 한 소속 기관에 속한 사용자들과 함께 모든 화면을 뿌려주고 거기에 따른 조회나 삭제 등을 보여줘야 하는거죠.

그리고 다른 AND 절에 보시면 보여주지 말아야 할 화면도 있습니다.

그 화면을 제외한 모든 화면과 조회 삭제 권한을 보여줄 수 없을까요? 물론 사용자 정보도 함께요..

공무원이 급하게 해달라는데... 제가 아직 오라클은 잘몰라서

쿼리를 짜긴 짰는데 저게 한계이네요..

고수님들의 많은 조언 부탁합니다.

by feelie [2009.04.29 09:43:15]
아우트조인은 조건에 사용된 모든 컬럼에 아우트조인사인이 들어가야합니다.
WHERE U.URL_ID = S.URL_ID(+)
AND M.MGR_ID = S.MGR_ID(+)

by 마농 [2009.04.29 10:28:01]
바로 두개의 테이블과 아우터 조인은 안됩니다. 에러납니다.
다음 두가지 방식중 하나로 변경해보세요.
1. 먼저 u와 m을 조인한 집합을 인라인뷰로 만드신후 s와 아우터 조인
2. Ansi SQL을 통한 아우터 조인

by 볼우물 [2009.04.29 10:28:33]
죄송합니다만.. 그렇게 하면 오류가 납니다.
토드 오류창이 뜨는데 이렇게 나오네요
ORA-01417: 하나의 테이블은 하나의 다른 테이블과 포괄 조인할 수 있습니다

by 볼우물 [2009.04.29 10:35:40]
마농님.. U와 M은 공통 컬럼이 없습니다.

by 마농 [2009.04.29 11:00:42]
묻지마 조인을 하시면 됩니다.(조인조건이 없는 조인)

by 볼우물 [2009.04.29 11:02:27]
아하 그렇군요.. 저는 오타인줄 알고 다른 테이블을 조인하고 있었습니다.^^;; 지금 빨리 해보겠습니다.

by 볼우물 [2009.04.29 11:21:00]
마농님 감사합니다 ^^ 해결됐네요.. 묻지마 조인 ㅎㅎㅎ 좋은 공부되겠습니다. ㅎ Ansi sql은 잘몰라서 안해봤구요.. 이따가 인터넷 검색해서 저 방법도 해볼게요. 좋은 하루 되세요~

by 마농 [2009.04.29 11:27:14]

by 볼우물 [2009.04.30 09:33:59]
감사합니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입