WITH RECURSIVE linked(id, path) AS (
SELECT :id,
ARRAY[:id]
UNION ALL
SELECT t3b.table1_id,
path || t3b.table1_id
FROM table3 AS t3a, table3 AS t3b, linked AS l
WHERE t3a.table1_id = l.id
AND t3b.table2_id = t3a.table2_id
AND t3b.table1_id != t3a.table1_id
AND NOT (t3b.table1_id = ANY(path))
)
SELECT * FROM linked;