Итак, у меня есть три таблицы со следующей схемой,
Users(id, name)
Colleagues(id1, id2)
Friends(id1, id2)
И мне нужно написать запрос, который возвращает каждую пару идентификаторов, чтобы можно было связаться с id_2 с id_1, используя произвольное количество соединений между коллегами и друзьями.
Я разработал запрос, который дает мне каждое соединение, используя либо коллег, либо друзей, но не оба.
Вот что я придумал, пытаясь использовать обе таблицы в одном CTE:
WITH RECURSIVE Reachable (id_1, id_2)
AS (
SELECT
*
FROM (
SELECT
id,
FRIENDS.id2
FROM
USERS,
FRIENDS
WHERE
FRIENDS.id1 = USERS.id
UNION
SELECT
id,
COLLEAGUES.id2
FROM
USERS,
COLLEAGUES
WHERE
COLLEAGUES.id1 = USERS.id)
UNION
SELECT
*
FROM (
SELECT
REACHABLE.id_1,
FRIENDS.id2
FROM
REACHABLE,
FRIENDS
WHERE
REACHABLE.id_2 = FRIENDS.id1
UNION
SELECT
REACHABLE.id_1,
COLLEAGUES.id2
FROM
REACHABLE,
COLLEAGUES
WHERE
REACHABLE.id_2 = COLLEAGUES.id1));
Но я получаю эту ошибку:
Error: near line 1: recursive reference in a subquery: Reachable
Значит ли это, что я не могу / не должен использовать подзапросы в рекурсивном вызове вообще? Можно ли выполнить этот запрос внутри того же CTE? если так, как я могу это сделать?
Заранее спасибо!