[계층형 쿼리] START WITH ~ CONNECT BY
DB/Oracle
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 이라는 컬럼이 있으며, 이는 계층의 깊이를 의미한다.
반응형