[英]SQL Server recursive query with associated table
我有一个典型的父/子关系表来表示文件夹。 我的挑战是将它与另一个表结合使用。
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 = 66
与folder.id = 2
有关系
我需要做的是找到association.id
始祖与在创纪录的association
表。 。 使用上面的示例数据,给定folder.id
为3
我希望找到77
; 给定folder.id
为2
或4
我希望找到66
; 其他任何folder.id
值都将为null。
可以使用如下通用表表达式来查找文件夹的祖先:
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
我尝试在CTE的递归部分中使用LEFT JOIN
,但是SQL Server不允许这样做。
我对此有什么解决方法?
还是更好,这是一种直接查询特定association.id
吗? (例如,无需遍历我一直在尝试的CTE查询结果)
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
这将为您提供在关联表中具有值的记录。 然后,您可以将其限制为具有值的第一条记录,或仅获取最高结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.