UNION

Dev.Shinny·2023년 6월 9일
0

특정메뉴에 대한 삭제 권한을 가진 사용자 정보를 구하세요

대상테이블

  • A11.A1AT_USER_MASTER <- 사람 정보 (사번, 부서번호)
  • A11.A1DT_ROLE_DEPT <- 부서권한 정보
  • A11.A1DT_ROLE_USER <- 개인 권한 정보 0
  • A11.A1DT_ROLE <- 역할정보
  • A11.A1DT_ROLE_MENU_PERMISSION <- 역할의 메뉴(버튼) 정보 O
    제약조건
  • MENU_ID = 'E000837'
    출력대상
  • 부서명, 부서코드, 사번 0 , 사원명, 역할명, 메뉴ID 0, 추가 권한, 삭제 권한, 저장 권한, 조회 권한, 선택 권한, 엑셀 권한, 출력 권한, 닫기 권한, 표시여부
SELECT M.NM_KOR AS "사원명", M.DEPART_DPT_CD AS "부서코드", M.DEPRT_NM_KOR AS "부서명", R.NAME AS "역할명", P.*
FROM (SELECT EMPLOYEE_ID , P.*
        FROM A11.A1DT_ROLE_USER RU
            , (
                SELECT ROLE_ID 
                , MENU_ID 
                , ADD_PERMISSION AS "추가 권한"
                , DEL_PERMISSION AS "삭제 권한"
                , WRITE_PERMISSION AS "저장 권한"
                , READ_PERMISSION AS "조회 권한"
                , SELECT_PERMISSION AS "선택 권한"
                , EXCEL_PERMISSION AS "엑셀 권한"
                , PRINT_PERMISSION AS "출력 권한"
                , EXIT_PERMISSION AS "닫기 권한"
                , DISPLAY AS "표시여부"
                FROM A11.A1DT_ROLE_MENU_PERMISSION 
                WHERE MENU_ID = 'E000837' AND DEL_PERMISSION = '1'
            ) P
        WHERE RU.ROLE_ID = P.ROLE_ID
    ) P,
    A11.A1AT_USER_MASTER M, 
    A11.A1DT_ROLE R
 WHERE M.EMPLOYEE_ID = P.EMPLOYEE_ID AND P.ROLE_ID = R.ROLE_ID

UNION

SELECT NM_KOR, P.DEPT_CD, DEPRT_NM_KOR, R.NAME, EMPLOYEE_ID, P.ROLE_ID, P.MENU_ID
    , P.ADD_PERMISSION, P.DEL_PERMISSION, P.WRITE_PERMISSION, P.READ_PERMISSION
    , P.SELECT_PERMISSION, P.EXCEL_PERMISSION, P.PRINT_PERMISSION, P.EXIT_PERMISSION, P.DISPLAY
FROM  A11.A1AT_USER_MASTER M,
      (SELECT D.DEPT_CD
        , P.ROLE_ID 
        , P.MENU_ID 
        , P.ADD_PERMISSION 
        , P.DEL_PERMISSION 
        , P.WRITE_PERMISSION 
        , P.READ_PERMISSION
        , P.SELECT_PERMISSION 
        , P.EXCEL_PERMISSION 
        , P.PRINT_PERMISSION 
        , P.EXIT_PERMISSION 
        , DISPLAY 
      FROM A11.A1DT_ROLE_MENU_PERMISSION P,
          A11.A1DT_ROLE_DEPT D
      WHERE MENU_ID = 'E000837' AND DEL_PERMISSION = '1' AND D.ROLE_ID = P.ROLE_ID
     ) P
     , A11.A1DT_ROLE R
WHERE M.DEPART_DPT_CD = P.DEPT_CD AND P.ROLE_ID = R.ROLE_ID;

-- union 은 중복 검사를 해서 union all 보다 느림.
-- 그러니 데이터를 먼저 정제하고 union all 을 사용하는 것이 더 효율적이다.
-- 메인이 되는 테이블 = 리딩테이블
-- 오라클 HINT 요즘은 권장하지 않음 -> 차라리 옵티마이저가 알아들을 수 있게 쿼리를 짜라
-- 왜냐면 유지보수 할 때 힘들어짐. 버전이 업데이트 되면서 옵티마이저가 성능이 좋아졌는데 힌트가 있으면 하나하나 힌트를 찾아서 수정해야 함.
-- 옵티마이저는 통계를 가지고 작동하기 때문에, 실행 방식이 달라질 수 있기 때문에...! JOIN ORDDERS

profile
Hello I'm Shinny. A developer who try to enjoy the challenge.

0개의 댓글