2014-01-15 31 views
0

我有一個典型的父/子關係表來表示文件夾。我的挑戰是將它與另一個表一起使用。帶有關聯表的SQL Server遞歸查詢

folder表是這樣的:

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

association表是這樣的:

+--+--------+ 
|id|folderid| 
+--+--------+ 
|66|2  | 
+--+--------+ 
|77|3  | 
+--+--------+ 

使其中association.id = 66folder.id = 2

的關係,我需要什麼做的是找到第一個祖先的association.idassociation表中的記錄。。使用上面的示例數據,給出folder.id3我期望找到77;給定folder.id24我期待找到66;任何其他folder.id值都會找到空值。

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 

產生的結果:

查找文件夾祖先可以用公用表表達式這樣做

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

要包括association.id我在遞歸使用LEFT JOIN嘗試部分CTE,但這是SQL Server不允許的。

我對此有什麼解決方法?

或者更好的辦法是直接查詢特定的association.id? (例如,沒有遍歷我已經嘗試的CTE查詢的結果)

回答

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 

這將給你在關聯表中有值的記錄。然後,您可以將其限制爲具有某個值的第一條記錄,或者只是獲取最高結果

+0

謝謝!我一直想着如何使用遞歸語句,並沒有考慮使用結果。 – jltrem