티스토리 툴바


Recursive SQL(With문을 이용한)
보통 계층적인 구조를 만들때 사용한다.

Oracle의 Connect by절은 DB2에서는 없다.
그래서 With절을 이용해서 만들어야 한다.
다음 사이트를 참고한다.

http://www.ibm.com/developerworks/data/library/techarticle/dm-0510rielau/
DB2 9.5 SQL CookBook에도 나와있다.(18page 맨아래 예제, 307page)


예제 1. (LEVEL 숫자 포함)
Oracle
SELECT LEVEL, name
FROM emp
START WITH name = 'Goyal'
CONNECT BY PRIOR empid = mgrid

DB2
WITH n(level, empid, name) AS
          (SELECT 1, empid, name
             FROM emp
             WHERE name = 'Goyal'
           UNION ALL
           SELECT n.level + 1, nplus1.empid, nplus1.name
             FROM emp as nplus1, n
             WHERE n.empid = nplus1.mgrid)
SELECT level, name FROM n;

LEVEL      NAME
----------- ----------
          1 Goyal
          2 Zander
          2 Henry
          2 Scott
          3 McKeough
          3 Barnes
          3 O'Neil
          3 Smith
          3 Shoeman

  9 record(s) selected


예제 2.
Oracle
SELECT
    TO_CHAR(TO_DATE('201106','YYYYMM') + LEVEL-1, 'YYYYMMDD') AS DT,
    TO_CHAR(TO_DATE('201106','YYYYMM') + LEVEL-1, 'DAY') AS WEEK
FROM DUAL
CONNECT BY LEVEL <= TRUNC(TO_DATE('201106','YYYYMM')+32,'MM') - to_date('201106','YYYYMM')

DB2
WITH DateRange(dt) AS 

SELECT date('2011-06-01') AS dt FROM dual 
UNION ALL 
SELECT (date(dt) + 1 day) AS dt FROM DateRange WHERE dt < (date('2011-07-01') - 1 day) 

SELECT  to_char(A.dt,'YYYYMMDD') as dt  FROM DateRange A

예제 3.
Oracle
SELECT   LEVEL, TO_CHAR(TO_NUMBER('20111006') - 3 + LEVEL) Y_CD
FROM   DUAL
CONNECT BY LEVEL <= 3

DB2
WITH TEMPDATE(Y_CD, LVL) AS
(
SELECT CHAR(INTEGER('20111006')-2) AS Y_CD, 1 FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR(INTEGER(Y_CD) + 1), LVL+1 FROM TEMPDATE WHERE LVL <= 3
)
SELECT * FROM TEMPDATE
저작자 표시 비영리 변경 금지
Posted by RaiKan RaiKan