【问题标题】:How to do recursive select in PostgreSQL with array as an argument如何在 PostgreSQL 中以数组为参数进行递归选择
【发布时间】:2012-09-09 16:55:04
【问题描述】:

我正在尝试在 PostgreSQL 中实现简单的递归函数,但我无法完成它...

我有表 MyTable,其中包括列 Col1 和 Col2。里面的数据是这样的:

Col1 | Col2

1 | 2  
2 | 5 
2 | 6
3 | 7
4 | 5
4 | 2
5 | 3

我想编写一个函数,它以 Col1 f.e. 的参数数组为参数。 (1,2) 并像这样从 Col2 给我返回值:

1 | 2
2 | 5
2 | 6

然后,再次执行结果: (2, 5, 6) 所以:

1 | 2
2 | 5
2 | 6
5 | 3

(2 已经在里面了,键 '6' 不存在) 再一次(3):

1 | 2
2 | 5
2 | 6
5 | 3
3 | 7

对于 (7) 什么都没有,因为 Col1 中不存在值“7”。

这是一个简单的递归,但我不知道如何实现它。到目前为止,我得到了这样的东西:

with recursive aaa(params) as (
    select Col1, Col2
    from MyTable
    where Col1 = params -- I need an array here
    union all
    select Col1, Col2
    from aaa
)
select * from aaa;

当然不行

提前致谢

【问题讨论】:

    标签: arrays postgresql select recursion


    【解决方案1】:

    递归的基本模式是将基本情况作为联合的第一部分,在第二部分中将递归结果连接到生成下一级结果所需的内容。在您的情况下,它看起来像这样:

    WITH RECURSIVE aaa(col1, col2) AS (
            SELECT col1, col2 FROM mytable
                WHERE col1 = ANY (ARRAY[1,2]) -- initial case based on an array
        UNION -- regular union because we only want new values
            SELECT child.col1, child.col2
                FROM aaa, mytable AS child -- join the source table to the result
                WHERE aaa.col2 = child.col1 -- the recursion condition
    ) 
    SELECT * FROM aaa;
    

    【讨论】:

    • 这是一个很好的问题和很好的答案。这也解决了在不使用 CONNECTBY 的情况下从任何内部节点查询表示双向、多分支、自引用图的表的一般问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2021-10-20
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多