정미나닷컴
[Oracle] 오라클 고급 JOIN 테크닉 - 선분이력 JOIN 본문
선분이력 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.종료일자;
'IT' 카테고리의 다른 글
[Oracle] 오라클 고급 JOIN 테크닉 - 상호배타적 관계의 JOIN (0) | 2017.11.11 |
---|---|
[Oracle] 오라클 고급 JOIN 테크닉 - 징검다리 테이블 JOIN을 이용한 튜닝 (0) | 2017.11.08 |
[Oracle] 오라클 고급 JOIN 테크닉 - 점이력 조회 (0) | 2017.11.05 |
[Oracle] 오라클 고급 JOIN 테크닉 - 데이터 복제를 통한 소계 구하기 (1) | 2017.11.05 |
[Oracle] 오라클 고급 JOIN 테크닉 - 최종 출력 건에 대해서만 JOIN하기 (0) | 2017.11.05 |