2014-01-15 3 views
0

폴더를 나타내는 일반적인 부모/자식 관계 테이블이 있습니다. 내 과제는 다른 테이블과 함께 사용하는 것입니다.관련된 테이블이있는 SQL Server 재귀 쿼리

folder 테이블은 다음과 같이이다 :

+--+----+--------+ 
|id|name|parentid| 
+--+----+--------+ 
|1 |a |null | 
+--+----+--------+ 
|2 |b |1  | 
+--+----+--------+ 
|3 |c1 |2  | 
+--+----+--------+ 
|4 |c2 |2  | 
+--+----+--------+ 

association 테이블은 다음과 같이이다 : association.id = 66folder.id = 2

에 관계가 어디

그렇게
+--+--------+ 
|id|folderid| 
+--+--------+ 
|66|2  | 
+--+--------+ 
|77|3  | 
+--+--------+ 

내가 필요 그게 무슨 첫 번째 조상의 association.idassociation 테이블의 레코드. 위의 예제 데이터를 사용하여 folder.id3 인 경우 77을 찾을 것으로 예상됩니다. 이 2 또는 4이라고 가정하면 66을 찾을 수 있습니다. 다른 folder.id 값은 null을 찾습니다. 내가 재귀에 LEFT JOIN를 사용하여 시도 한 association.id를 포함하려면

+--+----+--------+---+ 
|id|name|parentid|lvl| 
+--+----+--------+---+ 
|1 |a |  |2 | 
+--+----+--------+---+ 
|2 |b |1  |1 | 
+--+----+--------+---+ 
|4 |c2 |2  |0 | 
+--+----+--------+---+ 

:

WITH [recurse] (id,name,parentid,lvl) AS 
(
    select a.id,a.name,a.parentid,0 FROM folder AS a 
    WHERE a.id='4' 
    UNION ALL 
    select r.id,r.name,r.parentid,lvl+1 FROM folder as r 
    INNER JOIN [recurse] ON recurse.parentid = r.id 
) 
SELECT * from [recurse] ORDER BY lvl DESC 

산출 결과 :

찾기 폴더 조상이 같은 공통 테이블 표현식 수행 할 수 있습니다 CTE의 일부분이지만 SQL Server에서는 허용되지 않습니다.

이 문제를 해결할 수있는 방법은 무엇입니까?

더 나은 방법은 특정 association.id을 직접 쿼리하는 것입니다. 이것은 당신에게 연결 테이블의 값을 갖는 레코드를 줄 것이다

답변

1
SELECT r.id, r.name, r.parentid, r.lvl, a.folderid, a.id as associationid 
FROM [recurse] r 
LEFT JOIN [association] a 
ON r.id = a.folderid 
WHERE a.folderId IS NOT NULL 
ORDER BY lvl DESC 

를 (예를 들면, CTE 쿼리의 결과를 걷는없이 나는 시도 된 것을). 그런 다음 값이있는 첫 번째 레코드로 제한하거나 최상위 결과 만 가져올 수 있습니다.

+0

감사합니다! 재귀 문을 사용하는 방법을 생각하고 결과 사용에 대해 생각하지 않았습니다. – jltrem