可以使用子句CONNECT BY
和START WITH
在Oracle中查询树。
例如:
SELECT RPAD (' ', (LEVEL - 1) * 4) || node_name AS node, LEVEL
FROM hierarchy
START WITH NVL (pig_ear_id, 0) = 0
CONNECT BY PRIOR id = pig_ear_id;
可以简单地过滤查询结果,以显示过滤谓词接受或位于root路径上的唯一节点:
SELECT RPAD (' ', (LEVEL - 1) * 4) || node_name AS node, LEVEL
FROM hierarchy
START WITH NVL (pig_ear_id, 0) = 0
CONNECT BY PRIOR id = pig_ear_id AND id IN (
SELECT id
FROM hierarchy
START WITH node_name = 'some-pattern'
CONNECT BY PRIOR pig_ear_id = id
);
PostgreSQL中的类似选择将使用子句WITH RECURSIVE ...
构建。据我所知,一个with-query不能包含在其他with-query中,以获得与Oracle允许的相同的过滤结果。
如何重写PostgreSQL中的第二个选择?..
答案 0 :(得分:2)
据我了解,其中带查询的查询无法包含在其他查询中
当然你可以,一个接一个地写:
{{1}}
请注意,{{1}}关键字只需在开头说明。无论你有多少递归CTE(但你需要在CTE链中至少有一个, if 你使用它)。
答案 1 :(得分:1)
如果你有一个调用某个函数的with查询,而该函数又有一个with查询, 然后它允许我们而不会引发任何错误......这样我们仍然可以嵌套查询。
通常我使用with子句创建了一个查询。看下面的第一个查询。 它有in子句,它具有选择查询,选择函数返回的记录(my_function)。 并且该函数具有另一个带查询的层次结构。
此外,我不知道你想从你的查询中返回什么。所以你需要改变查询。这只是实现所需结构的方法。
以下是sql server.Change的语法,适用于任何其他数据库。
create function my_function(@node_name varchar(40))
returns @temptable table
(
id varchar(40)
)
as
begin
with alias_list
(
pig_ear_id,
node_name,
id
) as (
select pig_ear_id, node_name, id
from hierarchy
where node_name = ?
union all
select b.pig_ear_id, node_name, id
from alias_list a, hierarchy b
where a.id = b.pig_ear_id)
insert into @temptable select * from alias_list;
return
end
=============================================== ===============
{{1}}
=============================================== =================