Запрос, вычисляющий минимальное расстояние между узлами ациклического ориентированного графа
WITH TC(src_pid, tgt_pid, distance)
AS
( SELECT src_pid, tgt_pid, 1 FROM Links

  UNION ALL

  SELECT P.src_pid, C.tgt_pid, P.distance+1
  FROM Links AS C
    JOIN TC AS P
      ON C.src_pid = P.tgt_pid )
SELECT src_pid, tgt_pid, MIN(distance) AS min_distance
FROM TC
GROUP BY src_pid, tgt_pid
ORDER BY src_pid, tgt_pid;

Поделитесь материалом с коллегами и друзьями