Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Another way to find parent id

ronald_2017Jan 26 2022

Hi All,

I use Oracle 19c. I have two qestions. First, is there any easy way to find parent id without using scalar subquery?

WITH
Q1 AS (
    SELECT 1 ID, 'A1' NODE, NULL PARENT_NODE FROM DUAL
    UNION ALL
    SELECT 2, 'B1', 'A1' FROM DUAL
    UNION ALL
    SELECT 3, 'B2', 'A1' FROM DUAL
    UNION ALL
    SELECT 4, 'C1', 'B1' FROM DUAL
    UNION ALL
    SELECT 5, 'C2', 'B2' FROM DUAL
    UNION ALL
    SELECT 6, 'C3', 'B1' FROM DUAL
)
SELECT 
    ID,
    NODE,
    PARENT_NODE,
    (SELECT T2.ID FROM Q1 T2 WHERE T2.NODE = T1.PARENT_NODE) PARENT_ID
FROM Q1 T1 ORDER BY 1;

Second, is there any solution to calculate SALARY_NEW column also without scalar subquery?

WITH
Q1 AS (
    SELECT 1 ID, 'A1' NODE, NULL PARENT_NODE, 1000 salary, 'F' C_TYPE FROM DUAL
    UNION ALL
    SELECT 2, 'B1', 'A1', 450, 'C' FROM DUAL
    UNION ALL
    SELECT 3, 'B2', 'A1', 700, 'C' FROM DUAL
    UNION ALL
    SELECT 4, 'C1', 'B1', 250, 'F' FROM DUAL
    UNION ALL
    SELECT 5, 'C2', 'B2', 350, 'C' FROM DUAL
    UNION ALL
    SELECT 6, 'C3', 'B1', 200, 'F' FROM DUAL
),
Q2 AS (
SELECT 
    ID,
    NODE,
    PARENT_NODE,
    (SELECT T2.ID FROM Q1 T2 WHERE T2.NODE = T1.PARENT_NODE) PARENT_ID,
    SALARY,
    C_TYPE
FROM Q1 T1
)
SELECT 
    V.*,
    CASE WHEN C_TYPE = 'F' THEN V.SALARY + ( ID = PRIOR PARENT_ID  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  ) END  SALARY_NEW
FROM Q2 V
ORDER BY ID;

image.png
Thanks

This post has been answered by Frank Kulash on Jan 26 2022
Jump to Answer
Comments
Post Details
Added on Jan 26 2022
6 comments
1,006 views