2016-10-06 3 views
0

대신 하나의 참조를 반환 내가 DB 테이블에게 holiday_replacement 다음 중 하나입니다 NULL재귀 SQL 쿼리는 재귀 참조

id (INT, NOT NULL) 
username (NVARCHAR, NOT NULL) 
holiday_replacement (INT, NULL) 

이 있거나 그것은 id 필드에 값을 참조합니다.

지금, 지정된 idholiday_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 

그러나,이 쿼리는 직접이 자신의 holiday_replacement로 @current_user_id을 참조도의 계정에 반환해야 다른 사용자를 고려하지 않습니다이있는 사용자 반환 현재 내가있다 이 연결. 나는 다음과 같은 3 사용자가있는 경우 예를 들어

는 : @current_user_id = 1 다음

id = 1, username = 'user_1', holiday_replacement = NULL 
id = 2, username = 'user_2', holiday_replacement = 1 
id = 3, username = 'user_3', holiday_replacement = 2 

쿼리 해야 반환

id 
--- 
2 
3 

을하지만, 현재 만 직접 참조하는 것을 고려 사용자 및 반환

id 
--- 
2 

내가 바꿀 필요가있는 부분에 대해서는 머리를 감쌀 수 없습니다. 누구든지 도와 줄 수 있습니까? 코드 아래

+0

당신은 복용 시도 했'WHERE' CTE에 외부? – JohnHC

+1

CTE에서 잘못 가입했습니다. 조인 표현식에서'ug.id = tn.holiday_replacement' instend of'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