The point in this case is that the starting point is the same for a line, let’s say a train line. The line starts on the same point, but ends on different end points. The services depends on the line where they are riding.
I’ve added the extra requested information, this could be extended with more lines.
Example table:
Initial situation:
x
Name Next Result
1000 1100 1
1100 1200 2
1100 2000 2
1200 1300 3
2000 3000 3
3000 4000 4
1300 1400 4
1400 1500 5
4000 5000 5
Expected result:
Name Next Result
1000 1100 1
1100 1200 2
1200 1300 3
1300 1400 4
1400 1500 5
1000 1100 1
1100 2000 2
2000 3000 3
3000 4000 4
4000 5000 5
If one extra row is added to the example input, the output would change as follows…
Example table:
Initial situation:
Name Next Result
1000 1100 1
1100 1200 2
1100 2000 2
1200 1300 3
2000 3000 3
3000 4000 4
1300 1400 4
1400 1500 5
4000 5000 5
4000 4100 5 -- Additional single row
Expected result:
Name Next Result
1000 1100 1
1100 1200 2
1200 1300 3
1300 1400 4
1400 1500 5
1000 1100 1
1100 2000 2
2000 3000 3
3000 4000 4
4000 5000 5
1000 1100 1 -- Everything from here is additional, caused by the one additional input row
1100 2000 2
2000 3000 3
3000 4000 4
4000 4100 5
Advertisement
Answer
You appear to be describing a tree structure…
/- 1200 - 1300 - 1400
1000 - 1100
- 2000 - 3000 - 4000
The results would then be both (all) paths from the root node.
WITH
leaf AS
(
SELECT *
FROM nodes
WHERE NOT EXISTS (SELECT *
FROM nodes AS lookup
WHERE lookup.name = nodes.next
)
),
recursed_path AS
(
SELECT
*,
next AS branch_name,
0 AS level
FROM
leaf
UNION ALL
SELECT
root.*,
leaf.branch_name,
level + 1
FROM
recursed_path AS leaf
INNER JOIN
nodes AS root
ON root.next = leaf.name
)
SELECT
*
FROM
recursed_path
ORDER BY
branch_name,
level DESC
EDIT:
Minor corrections made, and this link to a working demo…