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
|
CREATE OR REPLACE VIEW tmp AS
SELECT 1 as id, 1 as x1, 1 as y1, 2 as x2, 2 as y2
UNION SELECT 2, 2, 2, 5, 5
UNION SELECT 3, 5, 5, 8, 8 -- Un groupe allant de (1/1 à 8/8 via 2/2 et 5/5)
UNION SELECT 4, 10, 10, 12, 12
UNION SELECT 5, 12, 12, 15, 15
UNION SELECT 6, 15, 15, 18, 18 -- Un groupe allant de (10/10 à 18/18 en passant par 12/12 et 15/15
UNION SELECT 7, 20, 32, 20, 32; -- Un rond point faisant une circulaire de 20/32 à 20/32 --> Récursion infinie, sans cette ligne ça passe super bien
WITH RECURSIVE rec_tmp (id, x1, y1, x2, y2, id_pere, niveau) AS (
SELECT
id,
x1,
y1,
x2,
y2,
id,
0
FROM
tmp a
WHERE NOT EXISTS (
SELECT 1 FROM tmp b WHERE a.id <> b.id AND a.x1 = b.x2 AND a.y1 = b.y2
)
UNION ALL
SELECT
b.id,
b.x1,
b.y1,
b.x2,
b.y2,
a.id,
a.niveau + 1
FROM rec_tmp a
INNER JOIN tmp b ON a.x2 = b.x1 AND a.y2 = b.y1
)
SELECT id, dense_rank() OVER(ORDER BY id_pere) AS grp FROM rec_tmp; |
Partager