[Oracle] 동명이인 찾는 방법 (이름, 생년월일)
- 데이터베이스/오라클
- 2022. 7. 26.
오라클에서 동명이인을 찾기 위해서는 분석함수(OVER 절)를 사용하거나 GROUP BY ~ HAVING 절을 사용할 수 있다. 그 외에도 서브 쿼리 등을 활용할 수 있겠지만 분석함수를 사용하는 것이 가장 효율적인 듯하다. 동명이인은 동일한 이름이 여러 건 조회되었을 경우일 수도 있고, 동일한 이름이 여러 건 조회되고 동일한 이름 내에서 생년월일 등 추가로 식별할 수 있는 조건이 다를 경우 동명이인이라고 판단할 수 있다.
목차 |
이름만으로 동명이인 찾기
WITH emp_t(ename, birthdate, job) AS (
SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
SELECT '스미스', '1987-04-19', 'CLERK' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'CLERK' FROM dual UNION ALL
SELECT '클라크', '1981-06-09', 'MANAGER' FROM dual
)
SELECT ename
, birthdate
, job
, COUNT(*) OVER(PARTITION BY ename) AS sname_cnt
FROM emp_t
분석함수(OVER 절)를 사용하면 조회된 내역에서 다시 한번 집계를 할 수 있다.
동일한 이름이 두 번 이상 조회된 건수가 있으면 동명이인으로 판단할 수 있다.
조금 더 정확한 동명이인을 체크하기 위해서는 생년월일까지 포함해서 건수를 집계해야 한다.
이름 + 생년월일로 동명이인 찾기
WITH emp_t(ename, birthdate, job) AS (
SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
SELECT '스미스', '1987-04-19', 'CLERK' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'CLERK' FROM dual UNION ALL
SELECT '클라크', '1981-06-09', 'MANAGER' FROM dual
)
SELECT ename
, birthdate
, job
, COUNT(DISTINCT birthdate) OVER(PARTITION BY ename) AS sname_cnt
FROM emp_t
동일한 이름 내에서 중복을 제거한(DISTINCT) 생년월일 건수를 집계하였다.
이름이 동일하고 서로 다른 생년월일 건수가 두 건 이상이면 동명이인으로 판단할 수 있다.
"제임스"는 두 건이 조회되었지만 생년월일이 동일하므로 동일인으로 판단한다.
동명이인 여부를 Y, N으로 표시하기
WITH emp_t(ename, birthdate, job) AS (
SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
SELECT '스미스', '1987-04-19', 'CLERK' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'CLERK' FROM dual UNION ALL
SELECT '클라크', '1981-06-09', 'MANAGER' FROM dual
)
SELECT ename
, birthdate
, job
, DECODE( COUNT(DISTINCT birthdate) OVER(PARTITION BY ename)
, 1, 'N', 'Y' ) AS sname_yn
FROM emp_t
DECODE 함수를 사용하여 1건이면 'N'으로 그 외에는 'Y'로 표시하였다.
GROUP BY ~ HAVING으로 동명이인 찾기
WITH emp_t(ename, birthdate, job) AS (
SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
SELECT '스미스', '1987-04-19', 'CLERK' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
SELECT '제임스', '1981-12-03', 'CLERK' FROM dual UNION ALL
SELECT '클라크', '1981-06-09', 'MANAGER' FROM dual
)
SELECT ename
, COUNT(*) AS sname_cnt
FROM emp_t
GROUP BY ename
HAVING COUNT(DISTINCT birthdate) > 1
동명이인에 해당하는 사람의 이름만 추출할 때는 GROUP BY 절과 HAVING 절을 활용하면 된다.
동명이인에 해당하는 사람의 이름과 해당 인원 건수를 표시한다.