【发布时间】:2019-11-05 02:00:31
【问题描述】:
我有一个递归数据库表和所有表数据的分层视图
CREATE VIEW dbo.vw_hierarchicalView
AS
WITH hView (Id,
IdParent,
Level)
AS
(
SELECT tableParent.Id,
tableParent.IdParent,
1 AS Level
FROM dbo.vw_ComplaintWithStatus tableParent
WHERE tableParent.IdParent IS NULL
UNION ALL SELECT tableChild.Id,
tableChild.IdParent,
hw.level + 1 AS Level
FROM dbo.vw_ComplaintWithStatus tableChild
INNER JOIN hView hw ON tableChild.IdParent = hw.Id
)
SELECT final.Id,
final.IdParent,
ISNULL(final.Level, 1) AS Level
FROM hView final
当我查询所有数据时,所有的树都是正确的。
SELECT * FROM dbo.vw_hierarchicalView hw ORDER BY hw.Level, hw.Id
但是,如果我只想为一个 id 选择完整的树,查询只显示具有指定 id 的第一行
SELECT * FROM dbo.vw_hierarchicalView hw WHERE hw.Id = 5 ORDER BY hw.Level, hw.Id
我想在我的应用程序中使用它来使用实体框架查找树中的所有子记录。
应用逻辑返回给我一些记录,需要查找:
- 仅限第一个直接子记录
- 所有子记录(用于在网页中显示树)
I 类从视图中选择存储过程,并将 Id 作为此过程的参数,并在 WHERE tableParent.Id = @id 上替换条件 WHERE tableParent.IdParent IS NULL。此解决方案效果很好,但是...
我不想使用存储过程。
在没有数据库函数或过程的情况下,有什么方法可以解决这个问题吗?
【问题讨论】:
标签: sql-server tsql sql-server-2014