DB/Oracle

[계층형 쿼리] START WITH ~ CONNECT BY

Edward. K 2020. 7. 28. 11:04
반응형

주문 > 취소 관계아 아래  데이터와 같을때..
START WITH ~ CONNECT BY 절을 사용하여 하나의 주문에 엮여 있는 취소 건들을 하나로 조회할 수있다.

[주문정보] * 주문정보가 있어야 취소가 가능하다.

SELECT
	  A."주문번호"
	, A."원주문번호"
	, B."주문상품순번"
	, DECODE(A."구분", 1, '매출', 2, '취소') AS    "주문구분"
	, B."금액합계"
	, A."주문일"    
FROM
	주문_마스터 A,
	주문_상품 B
WHERE 1=1
	AND A."주문번호" = B."주문번호"
	AND A."주문번호" =  'OR00000000000001' -- 주문번호 


[취소정보] 

SELECT
	  A."주문번호"
	, A."원주문번호"
	, B."주문상품순번"
	, DECODE(A."구분", 1, '매출', 2, '취소') AS    "주문구분"
	, B."금액합계"
	, A."주문일" 
FROM
	주문_마스터 A,
	주문_상품 B
WHERE 1=1
	AND A."주문번호" = B."주문번호"
	AND A."원주문번호" =  'OR00000000000001'  -- 주문번호 
   

원주문번호 'OR00000000000001' 의 취소 주문번호인 'OR00000000000011' 의 번호로,
원주문번호에 엮인 주문건들의 합을 조회해보자.

[최상위 (매출)주문번호 하위의 주문(취소)정보들 가져오기]

 SELECT 
	  A."주문번호"
	, A."원주문번호"
	, B."주문상품순번"
	, DECODE(A."구분", 1, '매출', 2, '취소') AS    "주문구분"
	, B."금액합계"
	, A."주문일"
FROM
	주문_마스터 A,
	주문_상품 B
WHERE 1=1
	AND A."주문번호" = B."주문번호"
START WITH
	A."주문번호" = ( SELECT	MAX (Z."주문번호") 
                        FROM	주문_마스터 Z 
                        START WITH  Z."주문번호" = 'OR00000000000011'    --.ORD_NO = 'OR20170800011597'  인 값에서..
                        CONNECT BY PRIOR Z."원주문번호"  = Z."주문번호"    -- ORI_ORD_NO 아래의 ORD_NO를 연결하고.
                        GROUP BY CONNECT_BY_ISLEAF   -- 자식 노드가 있으면 1, 없으면 0 
                        HAVING 	CONNECT_BY_ISLEAF = '1'  
                     )
CONNECT BY  PRIOR A."주문번호" = A."원주문번호"   -- "주문번호" 아래의 "원주문번호"  
        AND PRIOR B."주문상품순번 = B."주문상품순번   
       

ㅜ.ㅜ 쿼리는 언제나 어려워......

START WITH  : 어떤 데이터로 계층구조를 지정할 것인가? 
                  가장 처음에 데이터를 거르는 플랜을 타게 되기때문에 해당 컬럼에는 인덱스가 걸려있어야 한다.
CONNECT BY : 각 행들의 연결 관계를 설정 ( 결과에는 LEVEL 이라는 컬럼이 있으며, 이는 계층의 깊이를 의미한다.

반응형