문제상황 출발 허브에서 도착 허브까지의 경로를 조회하는 재귀 쿼리에서, 재귀적으로 중간 경유지들을 모두 포함하여 경로를 조회하려 했습니다. 이를 위해 WITH RECURSIVE를 사용하였고, WHERE 절에 = 연산자를 사용하여 "특정 도착 허브에 도달하면 재귀를 멈추는" 조건을 설정했지만, 예상과 달리 첫 번째 경로만 반환되고 나머지 경로는 조회되지 않는 문제가 발생했습니다.

image.png

위와 같이 같이 시작허브의 첫 번째 경로만 반환되었고, 그 이후의 경로는 조회되지 않았습니다.

해결방법

문제를 해결하기 위해 = 연산자 대신 != 연산자를 사용했습니다. != 연산자는 특정 도착 허브에 도달하지 않은 경로만 계속 탐색하도록 하며, 도착 허브에 도달했을 때 재귀가 자동으로 종료됩니다.

이를 통해 중간 경유 허브들도 모두 포함된 전체 경로가 정상적으로 조회되었으며, 쿼리가 의도대로 동작하게 되었습니다.

image.png

WITH RECURSIVE hub_route AS (
    -- 시작 허브에서 시작하는 경로, 시퀀스를 1로 설정
    SELECT start_hub_id, dest_hub_id, route_path, 1 AS sequence
    FROM p_hub_path p
    WHERE p.start_hub_id = '04f028b5-ffca-45fa-9026-02b5d568a00d'  -- 시작 허브 ID

    UNION ALL

    -- 재귀적으로 중간 경로를 찾으며, 시퀀스를 증가시킴
    SELECT p.start_hub_id, p.dest_hub_id, p.route_path, hr.sequence + 1 AS sequence
    FROM p_hub_path p
             INNER JOIN hub_route hr ON hr.dest_hub_id = p.start_hub_id
    -- 마지막 허브에 도달하면 재귀적으로 멈추기 위한 조건
    WHERE hr.dest_hub_id != '7c2c15e2-b2fb-4af3-a03c-e06f4f9412c6' -- 도착 허브 ID
)
-- 최종적으로 특정 목적지 허브에 도달하는 경로를 조회
SELECT *
FROM hub_route
ORDER BY sequence;