by 지금부터 [Oracle Tuning] 계층 쿼리 connect by [2020.01.12 18:57:17]
안녕하세요?
3박4일 이걸로 씨름하다 아이디어가 고갈나서 도움 요청 드립니다.
이거 정말 약올라서 미쳐버리겠습니다.
먼저 테이블 구조는 이렇습니다.
설명드리자면 기존 회원이 몇 명의 신규 회원을 유치했는지를 구하는 겁니다.
단 신규 회원이 기존회원의 블로그에 있는 코드를 입력하고 가입했느냐 또는 유튜브에 있는 코드를 보고 가입했느냐 입니다.
신규 회원 가입시 추천인 ID, 유입 경로 구분을 필수값으로 받고 있습니다.
Table 이름: CUSTOMER | ||||
회원 ID | 추천인 ID | 유입 경로 구분 | A(블로그) | B(유튜브) |
00010 | 00001 | A | ||
00011 | 00002 | B |
제가 만든 쿼리의 순서는 이렇습니다.
신규 회원의 추천인과 유입경로구분을 찾는다. --> 추천인 ID 행으로 이동한다 --> A 또는 B에 1을 더해준다. --> 추천인은 이제 신규 회원이 되고 다시 이 회원을 추천한 사람은 누군지 찾는다.(connect by)
--> 반복한다.
그리고 쿼리는 이렇습니다.
컬럼은 이렇습니다.
(설명: 컬럼명)
회원ID:Userid
추천인ID:P_id
구매 금액대:user_rank
유입경로구분(블로그 or 유튜브): 유입경로구분
블로그: Type_A
유튜브:Type_B
=================================================================
BEGIN
FOR i IN ( SELECT Userid,P_ID,user_rank,유입경로구분,type_a,type_b FROM customer
START WITH userid in (SELECT USERID FROM customer)
CONNECT BY userid = PRIOR P_ID
ORDER SIBLINGS BY user_rank)
LOOP
IF i.user_rank>=10 and i.유입경로구분 = 'a' THEN UPDATE customer SET type_a = type_a + 1 WHERE Userid = i.P_ID;
ELSIF i.user_rank>=10 and i.유입경로구분 = 'b' THEN UPDATE customer SET type_b = type_b + 1 WHERE Userid = i.P_ID;
END IF;
END LOOP;
END;
===========================================================================================
이거 대체 뭐가 문제일까요?
아예 잘못 가고 있는 걸까요?
이제 자신도 없습니다.
도와주세요.ㅠㅠ
WITH CUSTOMER AS (SELECT '0001' USER_ID, '' P_ID, 'A' IN_TYPE FROM DUAL UNION ALL SELECT '0002' USER_ID, '0001' P_ID, 'A' IN_TYPE FROM DUAL UNION ALL SELECT '0003' USER_ID, '0002' P_ID, 'B' IN_TYPE FROM DUAL UNION ALL SELECT '0004' USER_ID, '0003' P_ID, 'A' IN_TYPE FROM DUAL UNION ALL SELECT '0005' USER_ID, '' P_ID, 'B' IN_TYPE FROM DUAL UNION ALL SELECT '0006' USER_ID, '0001' P_ID, 'A' IN_TYPE FROM DUAL) SELECT USER_ID , P_ID , IN_TYPE , ( SELECT COUNT(*) FROM CUSTOMER WHERE IN_TYPE = 'A' START WITH P_ID = A.USER_ID CONNECT BY PRIOR USER_ID = P_ID) A_CNT , ( SELECT COUNT(*) FROM CUSTOMER WHERE IN_TYPE = 'B' START WITH P_ID = A.USER_ID CONNECT BY PRIOR USER_ID = P_ID) B_CNT , ( SELECT COUNT(*) FROM CUSTOMER START WITH P_ID = A.USER_ID CONNECT BY PRIOR USER_ID = P_ID) TOTAL_CNT FROM CUSTOMER A;