본문 바로가기

Windows Developer/Oracle

[Oracle] EquJoin

[출처]http://www.itmembers.net/board/view.php?id=oracle&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=subject&desc=desc&no=30&PHPSESSID=0a6380ea559aaf4e033ed638baf52b0c

두개 이상의 테이블로부터 원하는 정보를 검색하기 위해서는 JOIN문을 사용한다. 그러나 JOIN이 반드시 두 개 이상의 테이블에서만 사용되는 것은 아니다. 하나의 테이블에서도 JOIN을 사용하여 마치 두개의 테이블 인 것처럼 사용할 수 있다. (이것을 Self Join이라고 한다.)



EMP_NUM, SKILL_NO, SKILL_NAME을 한번에 표시하고 싶다.
그런데 EMP_NUM 컬럼은  EMP_SKILL 테이블에만 있고, SKILL_NO컬럼은 EMP_SKILL과 SKILL테이블 모두에 있도, SKILL_NAME 컬럼은 SKILL 테이블에만 있다.
즉, 표현하고 싶은 컬림이 두개의 테이블에 나뉘어 있는 것이다.

이럴 때 두 개의 테이블에서 원하는 컬럼만 골라서 표시하려 한다면 JOIN을 사용한다.

1. 실습을 하기 전에 SKILL테이블 하나를 만들자.
CREATE TABLE SKILL
(  SKILL_NO CHAR(4) PRIMARY KEY,
   SKILL_NAME VARCHAR2(30) NOT NULL);

INSERT INTO SKILL VALUES ('C101', 'CUSTOMER ENGINEER');
INSERT INTO SKILL VALUES ('D101', 'DATABASE ADMIN');
INSERT INTO SKILL VALUES ('E101', 'ERP ENGINEER');
INSERT INTO SKILL VALUES ('P101', 'PROGRAMMER');
INSERT INTO SKILL VALUES ('S101', 'SYSTEM PROGRAMMER');
INSERT INTO SKILL VALUES ('S102', 'SYSTEM ADMIN');

2. 다음과 같이 입력하여 그 결과를 살펴보자.





그럼, 다음과 같은 테이블이 있을 때
A:EMP_NUM과 C:EMP_NUM이 같고, B:SKILL_NO와 C:SKILL_NO가 같은 레코드를 골라  EMP_NUM,
LAST_NAME, SKILL_NO, SKILL_NAME을 표시하려면 어떻게 해야 할까?




SELECT        A.EMP_NUM,
        LAST_NAME,
        B.SKILL_NO,
        SKILL_NAME
FROM        EMP                A,
      SKILL               B,
      EMP_SKILL        C
WHERE        C.EMP_NUM = A.EMP_NUM        
AND            C.SKILL_NO = B.SKILL_NO;


  [결론]
- JOIN은 하나 이상의 테이블에서 원하는 컬럼을 검색할 때 사용한다.
- 단, JOIN은 FROM 절에서 명시한 테이블의 컬럼에만 한정한다.
- 이때 컬럼 간의 값들이 서로 일치할 때만 사용하는 JOIN을 EQUJOIN이라고 한다.