2016-10-06 2 views
0

У меня есть таблица 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 

Я просто не могу обмотать голову тем, что мне нужно изменить. Может ли кто-нибудь помочь?

+0

Вы пробовали взятие 'WHERE' вне КТР? – JohnHC

+1

вы ошибаетесь в использовании CTE 'ug.id = tn.holiday_replacement' instend' ug.holiday_replacement = tn.id' в выражении объединения – Uday

ответ

1

использование ниже кода

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.id =tn.holiday_replacement 
) 
SELECT 
    id FROM 
    user_graph