PostgreSQL和过滤递归查询

时间:2015-08-05 17:11:36

标签: oracle postgresql filtering recursive-query

可以使用子句CONNECT BYSTART 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中的第二个选择?..

2 个答案:

答案 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}}

=============================================== =================