두개의 테이블 조인 관련 질문드립니다.. 0 1 790

by naverTT [2019.05.08 08:18:26]


INDEX DEPT_NAME DEPT_SEQ POS_NAME POS_SEQ USER_NAME
1234 인사팀 001 인사팀장 1 강호동
1234 홍보팀 002 사원 2

강호동

1234 기획팀 003 부팀장 3 강호동
5678 인사팀 001 사원 1 유재석
7890 기획팀 003 사원 1 이수근

위 테이블은 사용자정보 테이블입니다.

한 사람이 여러개의 직위를 겸할 수 있고, POS_SEQ = 1 본직, 나머지는 겸직 정보입니다.

휴가를 올릴 경우에는 겸직에 대해 대행자를 지정하여 휴가를 올리는데,

휴가(대행)정보 테이블은 아래와 같습니다.

[휴가(대행)정보테이블]

INDEX ROW_SEQ POS_SEQ REGENCY(대행자) ABSENCE_SDATE ABSENCE_EDATE
1234 1 1 5678 2019-05-07 8:00 2019-05-07 19:00
1234 2 3 7890 2019-05-07 8:00 2019-05-07 19:00

PK = INDEX, ROW_SEQ 이며, 어떤 직위에 대한 대행정보인지는 POS_SEQ로 확인합니다.

이 두개의 테이블을 연결하여 추출하고자 하는 row는 아래의 표입니다.

INDEX USER_NAME DEPT_NAME POS_NAME REGENCY ABSENCE_DATE
1234 강호동 인사팀 인사팀장 유재석 2019-05-07 8:00~2019-05-07 19:00
1234 강호동 홍보팀 사원   2019-05-07 8:00~2019-05-07 19:00
1234 강호동 기획팀 부팀장 이수근 2019-05-07 8:00~2019-05-07 19:00

 

[강호동,홍보팀,사원]에 대한 대행자 정보를 입력하지 않을 경우 휴가(대행)정보 테이블에 ROW는 쌓이지 않는 구조입니다.

다른 대행자정보를 보여줌과 동시에 '강호동,홍보팀,사원'이 현재(오늘) 휴가중임을 나타내고 싶습니다.

도움 부탁 드립니다.

by 마농 [2019.05.08 10:28:42]
WITH emp(idx, dept_name, dept_seq, pos_name, pos_seq, user_name) AS
(
SELECT 1234, '인사팀', '001', '인사팀장', 1, '강호동' FROM dual UNION ALL
SELECT 1234, '홍보팀', '002', '사원'    , 2, '강호동' FROM dual UNION ALL
SELECT 1234, '기획팀', '003', '부팀장'  , 3, '강호동' FROM dual UNION ALL
SELECT 5678, '인사팀', '001', '사원'    , 1, '유재석' FROM dual UNION ALL
SELECT 7890, '기획팀', '003', '사원'    , 1, '이수근' FROM dual
)
, abs(idx, row_seq, pos_seq, regency, absence_sdate, absence_edate) AS
(
SELECT 1234, 1, 1, 5678, '2019-05-08 08:00', '2019-05-08 19:00' FROM dual UNION ALL
SELECT 1234, 2, 3, 7890, '2019-05-08 08:00', '2019-05-08 19:00' FROM dual
)
SELECT *
  FROM (SELECT a.idx
             , a.user_name
             , a.dept_name
             , a.pos_seq
             , a.pos_name
             , c.user_name regency
             , MIN(b.absence_sdate ||'~'|| b.absence_edate) OVER(PARTITION BY a.idx) absence_date
          FROM emp a
          LEFT OUTER JOIN abs b
            ON a.idx = b.idx
           AND a.pos_seq = b.pos_seq
           AND b.absence_sdate < TO_CHAR(sysdate + 1, 'yyyy-mm-dd')
           AND b.absence_edate > TO_CHAR(sysdate    , 'yyyy-mm-dd')
          LEFT OUTER JOIN emp c
            ON b.regency = c.idx
        )
 WHERE absence_date != '~'
 ORDER BY idx, pos_seq
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입