SELECT
*
FROM product p, emp e
where e.grpcode =
( case
when e.grpcode = 'MASTE' then 넘어가고
when e.grpcode = 'ADMIN' then 넘어가고
when e.grpcode = 'MIDLE' then e.dept_id가 p.dept_id랑 같아야 되고
when e.grpcode = 'ILBAN' then e.emp_id가 p.emp_id랑 같아야 되고
)
이런 쿼리를 짜고 싶은데 방향이 안 잡혀서 질문 드립니다.
EMP : 로그인 아이디 정보를 가지고 있는 테이블 - 권한 (grpcode)
PRODUCT : 실제 조회할 테이블
MASTE - 개발용 슈퍼유저
ADMIN - 관리자 (슈퍼유저)
MIDLE - 중간관리자 - 자기 부서 것만 조회 가능
ILBAN - 사용자 - 자기 아이디에 해당하는 것만 조회 가능
인데 어떤 식으로 짜는 것이 좋을까요 ㅠㅠ...
일단 where 절이 case 문은 가능한 것 같은데 저것을 어떻게 해야 할 지 방향이 안 잡힙니다...
SELECT
*
FROM product p, emp e
where (
(:파라미터로받아올grpno = 'A')
or (:파라미터로받아올grpno = 'B' AND e.dept_id = p.dept_id)
or (:파라미터로받아올grpno = 'C' AND e.emp_id = p.emp_id)
);
이것도 아닌 거 같아서요 ㅠㅠ...
좀 복잡하긴 하지만
만약 DEPT_ID, EMP_ID 가 PRODUCT의 인덱스 컬럼이고 FULLSCAN 비용이 생각보다 높다면
아래와 같이 하시면 인덱스 활용이 가능하실 겁니다.
SELECT * FROM PRODUCT WHERE EXISTS (SELECT 1 FROM EMP WHERE EMP_ID = :EMP_ID AND GRPCODE IN ('MASTE', 'ADMIN')) UNION ALL SELECT * FROM PRODUCT A WHERE EXISTS (SELECT 1 FROM EMP B WHERE EMP_ID = :EMP_ID AND GRPCODE IN ('MIDLE') AND B.DEPT_ID = A.DEPT_ID) UNION ALL SELECT * FROM PRODUCT A WHERE EXISTS (SELECT 1 FROM EMP B WHERE EMP_ID = :EMP_ID AND GRPCODE IN ('ILBAL') AND B.E.EMP_ID = A.EMP_ID)
아.. 쓸데 없는 조인 필요 없이 그냥
EMP에서 GRPCODE 받아서 파라메터로 넘겨 주는 게 쿼리는 두번 실행하지만
조인 부담이 없으니 훨씬 낫겠네요.
SELECT * FROM PRODUCT WHERE :GRPCODE IN ('MASTE', 'ADMIN') UNION ALL SELECT * FROM PRODUCT A WHERE :GRPCODE IN ('MIDLE') AND DEPT_ID = :DEPT_ID UNION ALL SELECT * FROM PRODUCT A WHERE :GRPCODE IN ('ILBAN') AND EMP_ID = :EMP_ID