繁体   English   中英

具有关联表的SQL Server递归查询

[英]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 = 66folder.id = 2有关系

我需要做的是找到association.id始祖与在创纪录的association表。 使用上面的示例数据,给定folder.id3我希望找到77 给定folder.id24我希望找到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM