목록원리와 해법 (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 A.고객명, A.거주지역, A.주소, A.연락처, B.연체금액 FROM 고객 A, 고객별연체이력 B WHERE A.가입회사 = 'C70' AND B.고객번호 = A.고객번호 AND B.변경일자 = (SELECT MAX(C.변경일자) FROM 고객별연체이력 C WHERE C.고객번호 = A.고객번호 AND C.변경일자
데이터 복제를 통한 소계 구하기 (Cartesian Product)SELECT ROWNUM NO FROM DUAL CONNECT BY LEVEL
최종 출력 건에 대해서만 JOIN하기-- 전체 게시판 데이터 수백만 건-- 특정 게시판 유형(게시판유형 = :TYPE)에 속하는 데이터는 평균 10만 건-- 게시판_X01 : 게시판유형 + 등록일자 DESC + 번호SELECT * FROM (SELECT ROWNUM NO, 등록일자, 번호, 제목, 회원명, 게시판유형명, 질문유형명, COUNT(*) OVER () CNT FROM (SELECT A.등록일자, A.번호, A.제목, B.회원명, C.게시판유형명, D.질문유형명 FROM 게시판 A, 회원 B, 게시판유형 C, 질문유형 D WHERE A.게시판유형 = :TYPE AND B.회원번호 = A.작성자번호 AND C.게시판유형 = A.게시판유형 AND D.질문유형 = A.질문유형 ORDER BY A.등록..
선분이력 끊기→ 월도와 선분이력을 합하여 변환된 선분이력의 형태를 구해야 함 어떤식으로 JOIN을 해야될지 매우 헷갈린다;; 그럴땐.. Let's 실습!!CREATE TABLE MINA.TMONTH (MON, SDATE, EDATE) ASSELECT '2009/06', '2009/06/01', '2009/06/30' FROM DUAL UNION ALLSELECT '2009/07', '2009/07/01', '2009/07/31' FROM DUALUNION ALLSELECT '2009/08', '2009/08/01', '2009/08/31' FROM DUALUNION ALLSELECT '2009/09', '2009/09/01', '2009/09/30' FROM DUALUNION ALLSELECT '2009..
누적 매출 구하기SELECT T1.지점, T1.판매월, MAX(T1.매출) 매출, SUM(T2.매출) 누적매출 FROM 월별지점매출 T1, 월별지점매출 T2WHERE T1.지점 = T2.지점 AND T1.판매월 >= T2.판매월 -- 범위 연산자 JOINGROUP BY T1.지점, T1.판매월ORDER BY T1.지점, T1.판매월;▼ SELECT 지점, 판매월, 매출, SUM(매출) OVER (PARTITION BY 지점 ORDER BY 판매월RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 누적매출 FROM 월별지점매출; ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW N PRECEDING (ex : 10 PRECEDIN..
스칼라 서브쿼리 - 함수처럼 한 레코드 당 정확히 하나의 값만을 리턴하는 서브쿼리 - 주로 select-list에서 사용, 컬럼이 올 수 있는 대부분 위치에 사용 가능 SELECT EMPNO, ENAME, SAL, HIREDATE, (SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO = E.DEPTNO) DNAME FROM EMP E WHERE SAL >= 2000; -- Outer JOIN과 같은 결과 -- DEPT와 JOIN에 실패하는 EMP 레코드가 있다면 DNAME으로 NULL 값 출력 스칼라 서브쿼리의 캐싱 효과 - 오라클은 스칼라 서브쿼리의 입력 값과 출력 값을 내부 캐시(Query Execution Cache)에 저장 - 스칼라 서브쿼리가 수행될 때 일단 '입력 값'..
NL JOIN- Random access 발생량에 의해 성능이 좌우 -- 고객의 총 수는 10만 명, 납입 방법은 세가지-- 두 테이블 모두 JOIN 컬럼에 인덱스를 갖고 있다고 가정 - 필터 조건이 없는 경우SELECT /*+ use_nl (a b) */ A.납입방법, B.* FROM 납입방법 A, 고객 BWHERE B.납입방법코드 = A.납입방법코드; - 드라이빙 테이블 : 고객 T /*+ leading(b) use_nl(a) */▶ 10만번 + 10만번 = 총 20만번의 Random access - 드라이빙 테이블 : 납입 T /*+ leading(a) use_nl(b) */▶ 3번 + 10만번 = 총 10만 3번의 Random access * 다른 필터 조건이 없는 상황에서는 작은 쪽(=1쪽) 집..