SQL 5-8. 자체 조인
관련링크
본문
테이블을 자체 조인해야 하는 경우가 있다.
가령 하나의 게시판이 있다고 치자!
보이는 글 목록에서 특정글이 답변글 이라면 누구에 답변글 일지 알아야 할 필요가 있다.
이때 원글은 기본키 답글은 외래키로 작용한다.
각 사원의 관리자 이름을 찾으려면 EMPLOYEES테이블 자체를 조인해야 한다.
즉 자체 조인을 수행해야 한다.
이렇게 출력 하는것을
select * from EMPLOYEES where MANAGER_ID = 100 or EMPLOYEE_ID = 100;
조인문으로 바꾼다면
select e1.FIRST_NAME , e2.FIRST_NAME
from EMPLOYEES e1, EMPLOYEES e2
where e1.EMPLOYEE_ID = e2.MANAGER_ID ;
이때 별칭으로 구별해주지 않으면 에러가 생긴다.
조직도등과 같이 부모관계가 분명해야 할때 자가조인을 사용하면 좋다.
이 프로세스에서는 테이블을 두 번 검색한다.
첫 번째는 테이블의 LAST_NAME열에서 Whalen을 찾고 MANAGER_ID열에서 101값을 찾는다.
두 번째는 EMPLOYEE_ID열에서 101을 찾고 LAST_NAME열에서 Kochhar를 찾는다.
☞답)
SELECT worker.last_name || ' works for' || manager.last_name
FROM employees worker,employees manager
WHERH worker.manager id = manager.employee id;
☞설명)
예제는 EMPLOYEES 테이블을 자체 조인한다.
FROM절에 있는 두 테이블을 시뮬레이트하기 위해서 동일한 EMPLOYEES테이블에 대해 worker와 manager이라는 두 별칭을 사용한다.
이 예제에서 WHERE절은 “사원의 관리자 번호가 관리자의 사원번호와 일치하는 경우”를 의미하는 조인을 포함한다.
예제) ANSI 조인
오라클 디비 예제 : SELECT e.last_name emp, m.last_name mgr
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id);
MSSQL 디비 예제 :
select t1.title_id, t1.title, t2.price
FROM titles t1, titles t2
WHERE t1.title_id=t2.title_id
☞설명)
SELECT e.last_name emp, m.last_name mgr
FROM employees e , employees m
where (e.manager_id = m.employee_id);
create table tb1 (
ename varchar(10),
jumin1 char(13),
jumin2 char(13),
)
insert into tb1 values('이나영', '111111', '222222')
insert into tb1 values('아나영', '211111', '122222')
insert into tb1 values('가나영', '311111', '422222')
insert into tb1 values('나나영', '222222', '111111')
select t1.ename, t2.ename
from tb1 t1, tb1 t2
where t1.jumin1=t2.jumin2