如何在较大的sql语句中实现recursive with子句

时间:2016-09-04 21:17:34

标签: sql sql-server

我正在创建一个涉及一些递归条款的大型sql查询,而且我需要一些关于如何连接"的想法。他们与查询的其余部分。

首先,我想要完成的事情。我有一张这样的桌子:

ID      NAME            FOLDER
1       object1         folderA
2       object2         folderB
3       object3         folderC
4       folderA         folderD
5       folderB         folderD
6       folderD         folderE
7       folderC         NULL
...

因此,此处列出了对象以及放置这些对象的文件夹。作为更大查询的一部分,我现在想知道的是放置在特定文件夹中的对象或(递归的位置)部分进来一个子文件夹?喜欢:object1是否位于folderE的(或子文件夹中)?如果是这样,我希望列出所有子文件夹。

我设法通过递归的句子

得到答案
WITH recursive_statement (id, folder) AS
(
SELECT name, folder
FROM table
WHERE name = 'object1'
UNION ALL
SELECT t.name, t.folder
FROM table t
INNER JOIN recursive_statement rs
ON t.name = rs.folder
)
SELECT *
FROM recursive_statement

这将给我一个非常好的结果。即对于object1,我得到了

NAME            FOLDER
object1         folderA
folderA         folderD
folderD         folderE
folderE         NULL

但是我无法在更大的查询中插入此结果。我无法弄清楚如何将对象的名称放入with子句。有问题的对象名称在with子句中定义,不能从oustide设置。如果我用" WHERE name =' object1'"来自外部调用递归语句。然后我得到1行(当然)说' object1 - > folderA&#39 ;.这对我没有帮助。

我需要的是能够在语句中获取对象名称。像这样:

WITH recursive_statement (...) AS
(
-- my recursive statement which takes the object name in question from outside
)
SELECT *
FROM recursive_statement
-- Somehow get the object name inside the with clause from here

2 个答案:

答案 0 :(得分:0)

您可以组合几种公用表格式(CTE)并在下一次使用之前的CTE。这样的事情。

with cte1 as (
   select something from someTable
   where someCondition=1
),
recursive_statement (...) AS (
   select ... from otherTable
   where something in (select something from cte1)
)
select *
from recursive_statement 

答案 1 :(得分:0)

您可以在cte中保存原始名称并查询:

WITH recursive_statement AS ( 
SELECT name as OriginalName, name, folder 
FROM table 

UNION ALL 

SELECT rs.OriginalName, t.name, t.folder 
FROM table t 
INNER JOIN recursive_statement rs 
ON t.name = rs.folder 
 ) 

SELECT * 
FROM recursive_statement
Where OriginalName = 'object1'

递归仅在查询cte时发生,因此性能不会受到影响。