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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| WITH MaSequence AS
(
SELECT 'ID1' AS CLE, 'INVALID1' AS SUIVEUR, NULL AS PREDECESSEUR FROM dual union ALL
SELECT 'INVALID1' , 'ID2' , 'ID1' FROM dual union ALL
SELECT 'INVALID1' , 'ID3' , 'ID1' FROM dual union ALL
SELECT 'ID2' , 'INVALID2' , 'INVALID1' FROM dual union ALL
SELECT 'ID3' , 'ID4' , 'INVALID1' FROM dual union ALL
SELECT 'ID3' , 'INVALID3' , 'INVALID1' FROM dual union ALL
SELECT 'INVALID2' , NULL , 'ID2' FROM dual union ALL
SELECT 'ID4' , NULL , 'ID3' FROM dual union ALL
SELECT 'INVALID3' , 'ID5' , 'ID3' FROM dual union ALL
SELECT 'INVALID3' , 'INVALID4' , 'ID3' FROM dual union ALL
SELECT 'ID5' , 'ID6' , 'INVALID3' FROM dual union ALL
SELECT 'INVALID4' , 'ID7' , 'INVALID3' FROM dual union ALL
SELECT 'ID6' , NULL , 'ID5' FROM dual union ALL
SELECT 'ID7' , 'ID8' , 'INVALID4' FROM dual union ALL
SELECT 'ID8' , NULL , 'ID7' FROM dual
),
cte (CLE, SUIVEUR)
AS (
SELECT CLE, SUIVEUR
FROM MaSequence
WHERE PREDECESSEUR IS NULL
UNION ALL
SELECT CASE WHEN S.CLE LIKE 'INVALID%' THEN P.CLE ELSE S.CLE END , S.SUIVEUR
FROM cte P
INNER JOIN MaSequence S
ON S.CLE=P.SUIVEUR
)
SELECT X.CLE, X.SUIVEUR, P.CLE AS PREDECESSEUR
FROM cte X
LEFT JOIN cte P
ON P.SUIVEUR = X.CLE
WHERE X.CLE NOT LIKE 'INVALID%'
AND (X.SUIVEUR NOT LIKE 'INVALID%' OR X.SUIVEUR IS NULL);
CLE SUIVEUR PREDECESSEUR
--- ------- ------------
ID2 - ID1
ID3 ID7 ID1
ID3 ID5 ID1
ID3 ID4 ID1
ID4 - ID3
ID5 ID6 ID3
ID6 - ID5
ID7 ID8 ID3
ID8 - ID7
ID1 ID3 -
ID1 ID2 - |