Użyj zapytania rekurencyjnego (PostgreSQL w wersji 8.4 lub nowszej):
/* test data:
CREATE TABLE foo (id, r_id, a_id, p_id) AS
SELECT 1,9,9,0
UNION ALL SELECT 2,9,105,108
UNION ALL SELECT 3,9,102,9
UNION ALL SELECT 4,9,106,105
UNION ALL SELECT 5,9,108,102
;
*/
-- the query you need:
WITH RECURSIVE sub(s_id, s_r_id, s_a_id, s_p_id, row) AS (
SELECT id, r_id, a_id, p_id, 1 AS row FROM foo WHERE p_id = 0
UNION ALL
SELECT id, r_id, a_id, p_id, (row + 1) FROM foo JOIN sub ON s_a_id = p_id
)
SELECT * FROM sub ORDER BY row;