안녕하세요.
근태관리를 구성하는데
한달동안 시간을 체크하지 않은 사람을 추출하고자 하고자 합니다.
간단하게 예시를 들자면,
A테이블 | B테이블 | |||||
e_date | e_idno | e_time | e_dept | e_idno | e_name | |
20211101 | 120040013 | 0650 | 74 | 120040013 | 박동주 | |
120190035 | 0642 | 18 | 120190035 | 김진석 | ||
120140017 | 0659 | 72 | 120140017 | 남수정 | ||
20211102 | 120190035 | 0651 | ||||
120140017 | 0632 | |||||
20211103 | 120040013 | 0652 | ||||
120190035 | 0654 | |||||
120140017 | 0642 | |||||
20211104 | 120140017 | 0645 | ||||
결과값 | ||||||
e_date | e_idno | e_name | ||||
20211102 | 120040013 | 박동주 | ||||
20211104 | 120040013 | 박동주 | ||||
20211104 | 120190035 | 김진석 |
이렇게 결과값을 받고 싶은데 어떻게 해야 하나요?
고수님들의 조언 부탁드립니다.
SELECT T1.e_date, T2.e_idno, T2.e_name FROM (SELECT DISTINCT e_date FROM A) T1 CROSS JOIN B T2 LEFT OUTER JOIN A T3 ON T1.e_date = T3.e_date AND T2.e_idno = T3.e_idno WHERE T3.e_idno IS NULL
더 좋은 방법이 있을 듯도 한데...
이정도 밖에 생각이 안나네요.
제가 생각한 문제 해결 흐름도는 아래와 같습니다
1. A 테이블의 날짜와 B 테이블을 CROSS JOIN 해서 각 날짜마다 모든 인원이 있는 테이블을 만든다.
2. A 테이블을 위의 테이블에 LEFT OUTER JOIN 시킨다.
3. OUTER JOIN 시킨 테이블의 임의의 컬럼이 NULL 인 데이터만 추출한다.
DB 종류 및 버전은 뭔지?
오라클의 경우 PARTITION OUTER JOIN 방식 이용 가능합니다.
그 외의 경우 위 댓글의 방식을 이용하시면 됩니다.
전체 기간 조회인지? 특정기간 조회인지? 도 생각해 보세요.
WITH t_user AS ( SELECT 74 e_dept, '120040013' e_idno, '박동주' e_name FROM dual UNION ALL SELECT 18, '120190035', '김진석' FROM dual UNION ALL SELECT 72, '120140017', '남수정' FROM dual ) , t_data AS ( SELECT '20211101' e_date, '120040013' e_idno, '0650' e_time FROM dual UNION ALL SELECT '20211101', '120190035', '0642' FROM dual UNION ALL SELECT '20211101', '120140017', '0659' FROM dual UNION ALL SELECT '20211102', '120190035', '0651' FROM dual UNION ALL SELECT '20211102', '120140017', '0632' FROM dual UNION ALL SELECT '20211103', '120040013', '0652' FROM dual UNION ALL SELECT '20211103', '120190035', '0654' FROM dual UNION ALL SELECT '20211103', '120140017', '0642' FROM dual UNION ALL SELECT '20211104', '120140017', '0645' FROM dual ) SELECT a.e_date , b.e_idno , b.e_name FROM t_user b LEFT OUTER JOIN (SELECT * FROM t_data WHERE e_date BETWEEN '20211101' AND '20211104' ) a PARTITION BY (a.e_date) ON a.e_idno = b.e_idno WHERE a.e_idno IS NULL ;