행위

"SQL CONNECT BY"의 두 판 사이의 차이

DB CAFE

(CONNECT_BY)
6번째 줄: 6번째 줄:
 
  CONNECT BY 절
 
  CONNECT BY 절
 
  : 각 행들의 연결 관계를 설정
 
  : 각 행들의 연결 관계를 설정
 +
    PRIOR : CONNECT BY 절에 사용
 +
            CONNECT BY PRIOR 자식 컬럼 = 부모 컬럼       
 +
                      : 부모 → 자식 순방향 전개
 +
            CONNECT BY PRIOR 부모 컬럼 = 자식 컬럼
 +
                      : 자식 → 부모 역방향 전개
 +
ORDER SIBLINGS : 계층형 쿼리에서 정렬을 수행
  
 
* START WITH 는 가장 처음에 데이터를 거르는 플랜을 타게 되고, 따라서 이 컬럼에는 인덱스가 걸려있어야 성능을 보장받습니다.
 
* START WITH 는 가장 처음에 데이터를 거르는 플랜을 타게 되고, 따라서 이 컬럼에는 인덱스가 걸려있어야 성능을 보장받습니다.

2022년 5월 25일 (수) 16:10 판

thumb_up 추천메뉴 바로가기


1 CONNECT_BY[편집]

WHERE 절 
: 데이터를 가져온 뒤 마지막으로 조건절에 맞게 정리
START WITH 절
: 어떤 데이터로 계층구조를 지정하는지 지정
CONNECT BY 절
: 각 행들의 연결 관계를 설정
   PRIOR : CONNECT BY 절에 사용
           CONNECT BY PRIOR 자식 컬럼 = 부모 컬럼        
                      : 부모 → 자식 순방향 전개
           CONNECT BY PRIOR 부모 컬럼 = 자식 컬럼 
                      : 자식 → 부모 역방향 전개

ORDER SIBLINGS : 계층형 쿼리에서 정렬을 수행

  • START WITH 는 가장 처음에 데이터를 거르는 플랜을 타게 되고, 따라서 이 컬럼에는 인덱스가 걸려있어야 성능을 보장받습니다.
  • CONNECT BY 절의 결과에는 LEVEL 이라는 컬럼이 있으며, 이는 계층의 깊이를 의미합니다.

1.1 CONNECT_BY_ISCYCLE 가상컬럼[편집]

The CONNECT_BY_ISCYCLE pseudocolumn returns 1 if the current row has a child which is also its ancestor. Otherwise it returns 0.

You can specify CONNECT_BY_ISCYCLE only if you have specified the NOCYCLE parameter of the CONNECT BY clause. NOCYCLE enables Oracle to return the results of a query that would otherwise fail because of a CONNECT BY loop in the data.

1.2 CONNECT_BY_ISLEAF 가상컬럼[편집]

SELECT last_name "Employee", CONNECT_BY_ISLEAF "IsLeaf",
       LEVEL, SYS_CONNECT_BY_PATH(last_name, '/') "Path"
  FROM employees
  WHERE LEVEL <= 3 AND department_id = 80
  START WITH employee_id = 100
  CONNECT BY PRIOR employee_id = manager_id AND LEVEL <= 4
  ORDER BY "Employee", "IsLeaf";

1.3 LEVEL 가상컬럼[편집]

For each row returned by a hierarchical query, the LEVEL pseudocolumn returns 1 for a root row, 2 for a child of a root, and so on. A root row is the highest row within an inverted tree. A child row is any nonroot row. A parent row is any row that has children. A leaf row is any row without children. Figure 3-1 shows the nodes of an inverted tree with their LEVEL values.

sqlrf001.gif

1.4 사용예제[편집]

SELECT *
  FROM DUAL A
 CROSS JOIN (SELECT LEVEL LV 
               FROM DUAL 
            CONNECT BY LEVEL <= 7) B;
[결과]
DUMMY LV
----- --
X     1
X     2
X     3
X     4
X     5
X     6
X     7

1.4.1 원하는 기간 리턴 (일자만큼)[편집]

SELECT V_DATE
  FROM (SELECT TO_CHAR(TO_DATE('20140201', 'YYYYMMDD') + LEVEL - 1, 'YYYYMMDD') V_DATE 
          FROM DUAL
       CONNECT BY LEVEL <= TO_DATE('20140314', 'YYYYMMDD') - TO_DATE('20140201', 'YYYYMMDD')+1
     );

1.4.2 원하는 기간 리턴 (월별)[편집]

SELECT V_DATE
  FROM (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('201401','YYYYMM'), LEVEL-1),'YYYYMM') AS V_DATE
          FROM DUAL 
       CONNECT BY LEVEL <= MONTHS_BETWEEN(TO_DATE(TO_CHAR(SYSDATE,'YYYYMM'),'YYYYMM'),TO_DATE('201401','YYYYMM'))+1);

1.4.3 현재달 날짜 구하기[편집]

SELECT TRUNC(SYSDATE, 'month')   + (LEVEL - 1)  AS TDAY
  FROM DUAL
CONNECT BY LEVEL <=  (LAST_DAY(SYSDATE) - TRUNC (SYSDATE, 'month')  + 1);