У меня есть таблица DBРекурсивный SQL-запрос возвращает только одной ссылки вместо рекурсивных ссылок
id (INT, NOT NULL)
username (NVARCHAR, NOT NULL)
holiday_replacement (INT, NULL)
holiday_replacement
либо NULL
или он ссылается на значение в поле id
.
Теперь было бы тривиально, чтобы определить, для которых указанный id
был holiday_replacement, но усложнять этот запрос, holiday_replacement может быть прикован.
Проще говоря, пользователь может иметь holiday_replacement, которые сами по себе имеет holiday_replacement.
В таком случае запрос должен вернуть список всех пользователей на этом «график замены праздника».
В настоящее время я
WITH user_graph AS (
SELECT
*
FROM
table_name
WHERE
holiday_replacement = @current_user_id
UNION ALL
SELECT
tn.*
FROM
table_name tn
JOIN user_graph ug ON ug.holiday_replacement = tn.id
)
SELECT
id
FROM
user_graph
Однако этот запрос возвращает только те пользователи, которые имеют непосредственно ссылки @current_user_id
как их holiday_replacement и не учитывает каких-либо других пользователей, которые также должны быть возвращены на счет это цепочка.
Например, если у меня есть следующие 3 пользователей:
id = 1, username = 'user_1', holiday_replacement = NULL
id = 2, username = 'user_2', holiday_replacement = 1
id = 3, username = 'user_3', holiday_replacement = 2
затем для @current_user_id
= 1, запрос должен возвращения
id
---
2
3
, но в настоящее время он рассматривает только что прямых ссылки пользователь и возвращает
id
---
2
Я просто не могу обмотать голову тем, что мне нужно изменить. Может ли кто-нибудь помочь?
Вы пробовали взятие 'WHERE' вне КТР? – JohnHC
вы ошибаетесь в использовании CTE 'ug.id = tn.holiday_replacement' instend' ug.holiday_replacement = tn.id' в выражении объединения – Uday