我正在创建一个涉及一些递归条款的大型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
答案 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时发生,因此性能不会受到影响。