정미나닷컴

[Oracle] 오라클 고급 JOIN 테크닉 - 선분이력 JOIN 본문

IT

[Oracle] 오라클 고급 JOIN 테크닉 - 선분이력 JOIN

정미나 2017. 11. 5. 23:36

선분이력 JOIN

변경일자만으로 관리되는 점이력에 반해 선분이력은 시작일자, 종료일자로 관리


과거/현재/미래의 임의 시점 조회

-- 위 세 테이블을 JOIN하여 2004년 9월 1일 시점의 데이터를 조회

SELECT C.고객번호, C.고객명, C1.고객등급, C2.전화번호

   FROM 고객 C, 고객등급변경이력 C1, 전화번호변경이력 C2

 WHERE C.고객번호 = 123

     AND C1.고객번호 = C.고객번호

     AND C2.고객번호 = C.고객번호

     AND :dt BETWEEN C1.시작일자 AND C1.종료일자

     AND :dt BETWEEN C2.시작일자 AND C2.종료일자;

-- :dt = '20040901'


현재 시점 조회

- 미래 시점 데이터를 미리 입력하는 예약 기능이 없다면 현재 시점 조회는 '=' 조건으로 만들어 주는 것이 효과적

SELECT C.고객번호, C.고객명, C1.고객등급, C2.전화번호

   FROM 고객 C, 고객등급변경이력 C1, 전화번호변경이력 C2

 WHERE C.고객번호 = 123

     AND C1.고객번호 = C.고객번호

     AND C2.고객번호 = C.고객번호

     AND C1.종료일자 = '99991231'

     AND C2.종료일자 = '99991231';


※ 만약에 미래 시점 데이터를 미리 입력해두는 기능이 있다면?

SELECT C.고객번호, C.고객명, C1.고객등급, C2.전화번호

   FROM 고객 C, 고객등급변경이력 C1, 전화번호변경이력 C2

 WHERE C.고객번호 = 123

     AND C1.고객번호 = C.고객번호

     AND C2.고객번호 = C.고객번호

     AND TO_CHAR(SYSDATE, 'YYYYYMMDD') BETWEEN C1.시작일자 AND C1.종료일자

     AND TO_CHAR(SYSDATE, 'YYYYYMMDD') BETWEEN C2.시작일자 AND C2.종료일자;


BETWEEN JOIN

-- 주식시장에서 과거 20년 동안 당일 최고가로 장을 마친(종가=최고가) 종목을 조회

SELECT A.거래일자, A.종목코드, B.종목한글명, B.종목영문명, B.상장주식수, 

 A.시가, A.종가, A.체결건수, A.체결수량, A.거래대금

  FROM 일별종목거래및시세 A, 종목이력 B

WHERE A.거래일자 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE, -20*12), 'YYYYMMDD') 

     AND TO_CHAR(SYSDATE-1, 'YYYYMMDD')

    AND A.종가 = A.최고가

    AND B.종목코드 = A.종목코드

    AND A.거래일자 BETWEEN B.시작일자 AND B.종료일자;

- 1998년 5월 29일 거래한 종목이 당일 최고가로 장을 마쳤다면 그 시점의 종목명(LG건설)과 상장주식수가 읽혀지게 됨

▶ 거래 시점이 아니라 현재 시점의 종목명과 상장주식수를 출력하려면..

SELECT A.거래일자, A.종목코드, B.종목한글명, B.종목영문명, B.상장주식수, 

 A.시가, A.종가, A.체결건수, A.체결수량, A.거래대금

  FROM 일별종목거래및시세 A, 종목이력 B

WHERE A.거래일자 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE, -20*12), 'YYYYMMDD') 

     AND TO_CHAR(SYSDATE-1, 'YYYYMMDD')

    AND A.종가 = A.최고가

    AND B.종목코드 = A.종목코드

    AND TO_CHAR(SYSDATE, 'YYYYYMMDD') BETWEEN B.시작일자 AND B.종료일자;