문제상황
출발 허브에서 도착 허브까지의 경로를 조회하는 재귀 쿼리에서, 재귀적으로 중간 경유지들을 모두 포함하여 경로를 조회하려 했습니다. 이를 위해 WITH RECURSIVE
를 사용하였고, WHERE
절에 =
연산자를 사용하여 "특정 도착 허브에 도달하면 재귀를 멈추는" 조건을 설정했지만, 예상과 달리 첫 번째 경로만 반환되고 나머지 경로는 조회되지 않는 문제가 발생했습니다.
위와 같이 같이 시작허브의 첫 번째 경로만 반환되었고, 그 이후의 경로는 조회되지 않았습니다.
해결방법
문제를 해결하기 위해 =
연산자 대신 !=
연산자를 사용했습니다. !=
연산자는 특정 도착 허브에 도달하지 않은 경로만 계속 탐색하도록 하며, 도착 허브에 도달했을 때 재귀가 자동으로 종료됩니다.
이를 통해 중간 경유 허브들도 모두 포함된 전체 경로가 정상적으로 조회되었으며, 쿼리가 의도대로 동작하게 되었습니다.
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;