1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| WITH T AS (
SELECT 'X' ID, 'A' REF FROM DUAL
UNION ALL
SELECT 'X' ID, 'B' REF FROM DUAL
UNION ALL
SELECT 'Y' ID, 'A' REF FROM DUAL
UNION ALL
SELECT 'Y' ID, 'C' REF FROM DUAL
UNION ALL
SELECT 'Z' ID, 'D' REF FROM DUAL
UNION ALL
SELECT 'Z' ID, 'E' REF FROM DUAL
UNION ALL
SELECT 'W' ID, 'E' REF FROM DUAL
UNION ALL
SELECT 'X' ID, 'F' REF FROM DUAL
),
tid AS (SELECT ID, MIN(REF) AS minref
FROM T
GROUP BY ID),
tref AS (SELECT REF, MIN(ID) AS minid
FROM T
GROUP BY REF)
SELECT REF, ID,
(SELECT minref FROM tid WHERE tid.ID = t.ID) "1st_ref",
(SELECT minid FROM tref, tid WHERE tid.ID = t.ID AND minref = tref.REF) AS premier_id
FROM T |