enter image description hereenter image description hereUnable to migrate the merge code that contains level,connect by prior,start with (in postgresql from oracle).
Code:
MERGE INTO ABC.CUSTOMER CT
USING (SELECT CUST_NO,
CUST_HIGH_PARENT_NO,
CUST_CORP_POS,
CUST_CORP_SUBS,
TIMESTAMP,
LEVEL LVL,
(SELECT MAX(LEVEL)
FROM ABC.CUSTOMER
START WITH CUST_NO = CUST_NO
CONNECT BY PRIOR CUST_PARENT_NO = CUST_NO) MXLVL,
(SELECT CUST_NO
FROM ABC.CUSTOMER
WHERE CONNECT_BY_ISLEAF = 1
START WITH CUST_NO = CUST_NO
CONNECT BY PRIOR CUST_PARENT_NO = CUST_NO) HIGHPARENT
FROM ABC.CUSTOMER
START WITH CUST_NO = CUST_NO
CONNECT BY PRIOR CUST_PARENT_NO = CUST_NO) A
ON (UPC.CUST_NO = A.CUST_NO)
WHEN MATCHED THEN
UPDATE
SET
CUST_CORP_SUBS = (SELECT COUNT(*) - 1
FROM ABC.CUSTOMER
START WITH CUST_NO =
CT.CUST_NO
CONNECT BY PRIOR CUST_NO =
CUST_PARENT_NO),
CUST_CORP_POS = A.MXLVL - A.LVL,
CUST_HIGH_PARENT_NO= HIGHPARENT,
TIMESTAMP = SYSDATE;
I've
Tried below but unable to it fully. I need help.
Use recursive cte ,tried to use update ,subquery ,level.
Postgresql Code: The oracle query merging two rows in a database.
UPDATE ABC.CUSTOMER CT
SET CUST_PAYOR_SUBS = (SELECT COUNT(*)
FROM ABC.CUSTOMER
(WITH RECURSIVE CUST AS
(SELECT COUNT(*) FROM ABC.CUSTOMER WHERE CUST_NO = CT.CUST_NO
UNION ALL
SELECT COUNT(*) FROM ABC.CUSTOMER C ,ABC.CUSTOMER CUST
WHERE C.CUST_NO = CUST.CUST_PAYOR_NO)
SELECT COUNT(*)
FROM ABC.CUSTOMER CUST),
CUST_PAYOR_POS = A.MXLVL - A.LVL,
CUST_HIGH_PAYOR_NO = A.HIGHPAYOR,
TIMESTAMP = CURRENT_TIMESTAMP::TIMESTAMP(0)
FROM
(WITH RECURSIVE CTE AS
(SELECT CUST_NO,
CUST_HIGH_PAYOR_NO,
CUST_PAYOR_POS,
CUST_PAYOR_SUBS, 1 as level
FROM ABC.CUSTOMER
WHERE CUST_NO = '00009'---UPC.CUST_NO
UNION ALL
SELECT C.CUST_NO,
C.CUST_HIGH_PAYOR_NO,
C.CUST_PAYOR_POS,
C.CUST_PAYOR_SUBS,
C.level+1
FROM CTE C
JOIN ABC.CUSTOMER CUST ON C.CUST_NO = CUST.CUST_PAYOR_NO)
SELECT * FROM CTE) MXLVL,
WHERE UPC.CUST_NO = A.CUST_NO