【发布时间】:2016-10-30 19:58:31
【问题描述】:
我有三个 SQL Server 表:Projects、ProjectTree、ProjectTreeRec。
Projects 类似于目录,我试图在名为Standard Parts 的目录下查找所有子目录。显然这里需要递归。
Projects 表具有以下列:
ProjectID, Name, Deleted
ProjectTree 表具有以下列:
ProjectID, ChildProject
我认为我不需要ProjectTreeRec 表作为这项工作的一部分,但它包含ChildProjectID、ParentProjectID、Level 列。
我想开发一个递归选择语句来查找Standard Parts目录下所有未被删除的子目录(不是1,而是0)。
我是 CTE 和递归的新手。我得到了一些结果,但不是我所追求的。
这是非递归调用,它找到了我的第一级,但没有更深入。它工作正常。
SELECT
'(Directory Not Available)'
UNION
SELECT DISTINCT
C.[Name]
FROM
[EPDM].[dbo].[Projects] A
JOIN
[EPDM].[dbo].[ProjectTree] B ON B.ProjectID = A.ProjectID
JOIN
[EPDM].[dbo].[Projects] C ON B.childproject = C.projectid
WHERE
A.name = 'Standard Part Library'
AND A.[Deleted] = 0;
欢迎任何帮助。
【问题讨论】:
-
您使用的是哪个版本的 SQL Server?
-
你可以检查它的递归 CTE:stackoverflow.com/questions/37973842/…
-
我使用的是 SQL Server Standard 2014。
-
SELECT SUBSTRING([Path], 0, (LEN([Path]) )) as [Path] FROM ( SELECT -- 将标准部分字符串替换为空白,然后从中替换 '\'空白 REPLACE([Path], '\03-Standard Parts\', '') as [Path] FROM Projects Where [Path] Like '%Standard Parts%' and Deleted = 0 ) as x
-
旁注:我建议养成使用更具表现力、更有意义表别名的习惯,而不仅仅是
a和b.....pforProjects,ptforProjectTree和p2forProjects(第二次出现)对于查看您的代码的人来说会更直观跨度>
标签: sql sql-server tsql recursion sql-server-2014