首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在postgres函数中使用plpgsql递归返回表?不使用CTE/With Recursive

在PostgreSQL函数中使用PL/pgSQL递归返回表,可以通过使用循环和临时表来实现。以下是一个示例函数,演示了如何在PL/pgSQL中实现递归返回表的功能:

代码语言:txt
复制
CREATE OR REPLACE FUNCTION recursive_function()
RETURNS TABLE (id INT, name TEXT) AS $$
DECLARE
    rec RECORD;
BEGIN
    -- 创建临时表用于存储结果
    CREATE TEMPORARY TABLE temp_table (id INT, name TEXT) ON COMMIT DROP;

    -- 递归函数
    CREATE OR REPLACE FUNCTION recursive_func(id INT)
    RETURNS VOID AS $$
    BEGIN
        -- 将当前行插入临时表
        INSERT INTO temp_table SELECT id, name FROM your_table WHERE id = recursive_func.id;

        -- 递归调用
        FOR rec IN SELECT id, name FROM your_table WHERE parent_id = recursive_func.id LOOP
            PERFORM recursive_func(rec.id);
        END LOOP;
    END;
    $$ LANGUAGE plpgsql;

    -- 调用递归函数
    PERFORM recursive_func(0);

    -- 返回临时表中的结果
    RETURN QUERY SELECT * FROM temp_table;
END;
$$ LANGUAGE plpgsql;

在上述示例中,我们首先创建了一个临时表temp_table,用于存储递归查询的结果。然后,我们定义了一个递归函数recursive_func,该函数接受一个id参数,并将满足条件的行插入到临时表中。在递归函数中,我们使用循环遍历满足条件的子行,并递归调用recursive_func函数。最后,我们在主函数recursive_function中调用递归函数,并返回临时表中的结果。

请注意,上述示例中的your_table是一个占位符,你需要将其替换为实际的表名。此外,你还可以根据需要调整函数的返回类型和参数类型。

推荐的腾讯云相关产品:腾讯云数据库 PostgreSQL,它是腾讯云提供的一种高性能、可扩展的关系型数据库服务。你可以通过以下链接了解更多信息:腾讯云数据库 PostgreSQL

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PostgreSQL 使用递归SQL 找出数据库对象之间的依赖关系 - 例如视图依赖

背景: 在数据库对象与对象之间存在一定的依赖关系,例如继承之间的依赖,视图与基的依赖,主外键的依赖,序列的依赖等等。...在删除对象时,数据库也会先检测依赖,如果有依赖,会报错,需要使用cascade删除。 另外一方面,如果需要重建使用重命名的方式是有一定风险的,例如依赖关系没有迁移,仅仅迁移了是不够的。...所以迁移,通常使用的是增量迁移数据,同时使用替换filenode的方式更加靠谱,依赖关系不变。 本文将介绍一下如何查找依赖关系。...,递归的得到依赖的对象。...获取视图的定义 14:41:21 db: postgres@postgres, pid:54661 =# select * from pg_get_viewdef('v1',false);

1.4K40

进阶数据库系列(十):PostgreSQL 视图与触发器

概述 视图(View)本质上是一个存储在数据库的查询语句。视图本身包含数据,也被称为虚拟。 我们在创建视图时给它指定了一个名称,然后可以像一样对其进行查询。 优势 不保存数据,节省空间。...如果视图引用的任何是临时的,视图将被创建为临时视图(不管有没有指定TEMPORARY)。 RECURSIVE:创建一个递归视图。 name:#要创建的视图的名字(可以是模式限定的)。...视图的选择列表不能包含任何聚集、窗口函数或者集合返回函数。 一个更加复杂的不满足所有这些条件的视图默认是只读的:系统将不允许在该视图上的插入、更新或者删除。...PostgreSQL 触发器 什么是触发器和触发器函数 触发器:一个触发器是一种声明,告诉数据库应该在执行特定的操作时执行特定的函数。 触发器函数:是指一个没有参数并且返回trigger类型的函数。...,SQL语句如下: SELECT * FROM timedb; 查看和修改触发器 可在pgAdmin操作 触发器的使用 创建一个account,然后创建一个触发器,用于检测account的列name

1K10
  • 探索MySQL递归查询:处理层次结构数据

    在数据库管理,处理具有层次结构的数据一直是一项常见任务。MySQL的递归查询功能通过公用表表达式(CTE)为处理这类数据提供了便捷的方式。...语法解释 在MySQL递归查询的基本语法结构如下所示: WITH RECURSIVE cte_name AS ( -- 初始查询(第一次迭代) SELECT initial_query...join_condition ) -- 最终查询 SELECT * FROM cte_name; 在这个语法cte_name 是公用表表达式的名称,initial_query 是初始查询,recursive_query...案例演示 下面通过一个实际案例来展示如何在MySQL利用递归查询处理组织结构数据。假设我们有一个名为employees的,包含员工的id、姓名和直接上级的id。...MySQL5.7的实现 在 MySQL 5.7 递归查询不支持使用公用表表达式(CTE),而是通过使用用户定义变量(User-Defined Variables)和自连接(Self Join

    97010

    记录下关于SQL Server的东西

    CTE之所以与其他表表达式不同,是因为它支持递归查询: 定义一个递归CTE,至少需要两个查询(或者更多),第一个查询称为定位点成员(anchor member),第二个查询称为递归成员(recursive...递归成员是一个引用了CTE名称的查询,对CTE名称的引用表示查询在一个执行序列逻辑上的“前一个结果集”,第一次调用递归成员时,它表示的就是定位点成员的查询结果,之后调用递归时,引用CTE则代表前一次调用所返回的结果集...在返回的查询结果上,两个成员必须保持一直(列的属性); 例如: 定位点成员对HR.Employeesempid=2的结果进行查询,这个查询只执行一次; 递归成员则对CTE(前一次查询的结果集)和Employees...直到返回结果为空,终止递归,默认情况下递归次数超过100次,超过100次会终止,可以修改默认设置。...视图和内联函数(inline TVF)是一种可重用的表表达式,它们是保存在数据库的,除非drop掉,否则属于永久可用的部分。

    1.3K10

    MySQL 8.0从入门到精通

    即使有另一个可用的索引,它也将执行全扫描。 在大型上,这可能会导致严重的性能问题。 即使MySQL在查询执行期间抛出任何错误,它也应该会在错误日志记录一个警告。...以下说明递归CTE的语法 WITH RECURSIVE cte_name AS ( initial_query -- anchor member UNION ALL recursive_query...递归成员限制递归成员不能包含以下结构 聚合函数MAX,MIN,SUM,AVG,COUNT等 GROUP BY子句 ORDER BY子句 LIMIT子句 DISTINCT 请注意,上述约束不适用于锚定成员...简单的MySQL递归CTE示例请参阅以下简单的递归CTE 示例: WITH RECURSIVE cte_count (n) AS ( SELECT 1 UNION ALL...当n等于3,递归成员将返回一个空集合,将停止递归。下图显示了上述CTE的元素: 递归CTE返回以下输出: 递归CTE的执行步骤如下: 首先,分离锚和递归成员。

    1.1K20

    SQL优化(五) PostgreSQL (递归CTE 通用表表达式

    如果WITH里面使用的不是SELECT语句,并且没有通过RETURNING子句返回结果集,则主查询不可以引用该CTE,但主查询和WITH语句仍然可以继续执行。...目前,任何一个被数据修改CTE,不允许使用条件规则,和ALSO规则以及INSTEAD规则。...不允许使用FULL JOIN recursive term不允许使用GROUP BY和HAVING 不允许在recursive term的WHERE语句的子查询中使用CTE的名字 不支持在recursive...recursive term中使用 recursive termSELECT后面不允许出现引用CTE名字的子查询 同时使用多个CTE表达式时,不允许多表达式之间互相访问(支持单向访问) 在recursive...term不允许使用FOR UPDATE CTE 优缺点 可以使用递归 WITH RECURSIVE,从而实现其它方式无法实现或者不容易实现的查询 当不需要将查询结果被其它独立查询共享时,它比视图更灵活也更轻量

    2.6K60

    10个高级SQL写法,包括窗口函数、联合查询、交叉查询、递归查询

    通过使用SQL语句,可以对数据库的表格进行查询、更新、删除等操作。本文将分享10个高级SQL写法,包括窗口函数、联合查询、交叉查询、递归查询等。...窗口函数窗口函数(Window Function)是一类特殊的函数,它可以在某个数据集上执行聚合操作(求和、计数、平均值)并返回多行结果,同时还可以访问同一数据集中的其它行。1....CROSS JOINCROSS JOIN操作将两个表格的每一行进行配对,并返回所有可能的组合结果。...SELECT * FROM table1 CROSS JOIN table2;递归查询递归查询(Recursive Query)是指在查询中使用自身的查询语句,通常用于处理树形结构数据。6....WITH RECURSIVEWITH RECURSIVE操作用于实现递归查询,可以逐级遍历树形结构数据。

    1.2K80

    Mysql用链式存储结构存一组数据,如何用最少查询得到完整链条?

    Mysql 中使用链式存储结构保存一组数据,通常是通过在建立父子关系来实现的。比如,在中保存每个节点的 id 和 parent_id, parent_id 表示该节点的父节点 id....使用 while 循环进行递归查询,直到根节点为止。每次执行循环体前检查 target_parent_id 是否为 0,如果是,说明已经到达链条顶端,停止循环。...将该节点信息添加到结果数组。 将 target_parent_id 修改为当前节点的 parent_id. 最后返回结果数组,即为目标节点所在链条的完整链路。...id 的节点及其所有父节点 WITH RECURSIVE cte AS ( SELECT id, name, parent_id FROM node WHERE id =...ON cte.parent_id = p.id ) SELECT * FROM cte; 以上代码,通过 WITH RECURSIVE 语法可以循环查询出目标节点的所有父节点信息,并最终返回完整的链条

    50410

    postgresql 触发器 简介(转)

    可以在系统或系统视图上创建触发器吗? ---- 二、 以plpgsql语言为例, 讲解触发器函数. 触发器函数返回值. 触发器函数的参数. 触发器函数的变量与传递....触发器函数的数据可视与什么有关? 触发器会无限递归吗? 如何避免? 触发条件与性能. 加入触发器后的事务特性. 触发器的返回值是如何影响returning的结果的?...例如使用plpgsql写的触发器函数, 通过变量TG_ARGV[]来接收传入的变量值....plpgsql函数FOUND和ROW_COUNT变量的值. – 把before for each row的触发器删掉, 再测试插入 : postgres=# drop trigger tg02...FOUND和ROW_COUNT在plpgsql函数使用 : 如果的before for each row触发器函数返回空, 将导致跳过该行处理, 因此如果整个SQL的行都跳过处理那么最终的FOUND

    3.9K20

    LLM辅助的从Postgres到SQLite和DuckDB的翻译

    Powerpipe 使用 HCL 定义小组件(包括图表、表格、信息卡和选择列表),并使用 SQL 将数据传输到这些小组件。我们从 HCL 层开始。...Powerpipe 将名称作为字符串数组传递,这是一个本机 Postgres 类型,可以使用其 unnest 函数展开。...对于这些名称的每一个,第二个 CTE 会计算 hn 中标题与名称匹配且时间戳在所需范围内帖子的数量。 这在 SQLite 或 DuckDB 均不起作用。两者都不能接受字符串数组作为参数。...在 SQLite ,它出乎意料地复杂。 如果可能,我宁愿避免 SQL 递归。在这种情况下,ChatGPT 和 Claude 都指出了相同的解决方案,所以我勉强接受了。...它感觉几乎和 SQLite 一样轻,Postgres 风格的 SQL 比 SQLite 更容易移植到它,它甚至可以附加 Postgres 。但 DuckDB 还有另一种个性。

    7510

    T-SQL—理解CTEs

    再本篇,我们将看到如何定义和使用CTE。 定义和使用CTE 通过使用CTE你能写和命名一个T-SQL select 语句,然后引用这个命名的语句就像使用一个或者试图一样。...下面是一些在CTE可以被使用的选项: ORDER BY (当使用top的时候可以使用) INTO OPTION (带有查询提示) FOR XML FOR BROWSE 递归CTE语句 我理解递归就是调用自己的过程...递归CTE,包含了至少两个查询定义,一个是select语句,另一个查询被作为“锚成员”,而其他的查询定义被作为循环成员。锚成员查询定义包含CTE而循环成员包括。...为了更好地理解递归CTE,我将创建一个实例数据通过使用递归CTE, 下面就是代码Listing 6: USE tempdb; GO -- 先创建一个用户 CREATE TABLE dbo.Employee...何时使用CTE 当然我们学习了如何使用CTE就要知道什么时候来使用它,下面三种情况是使用CTE简化你的T-SQL语句的情况: 查询需要递归 查询中有多个子查询,或者你有重复的相同的子查询在单一语句中。

    2K90

    T-SQL—理解CTEs

    再本篇,我们将看到如何定义和使用CTE。 定义和使用CTE 通过使用CTE你能写和命名一个T-SQL select 语句,然后引用这个命名的语句就像使用一个或者试图一样。...下面是一些在CTE可以被使用的选项: ORDER BY (当使用top的时候可以使用) INTO OPTION (带有查询提示) FOR XML FOR BROWSE 递归CTE语句 我理解递归就是调用自己的过程...递归CTE,包含了至少两个查询定义,一个是select语句,另一个查询被作为“锚成员”,而其他的查询定义被作为循环成员。锚成员查询定义包含CTE而循环成员包括。...为了更好地理解递归CTE,我将创建一个实例数据通过使用递归CTE, 下面就是代码Listing 6: USE tempdb; GO — 先创建一个用户 CREATE TABLE dbo.Employee...何时使用CTE 当然我们学习了如何使用CTE就要知道什么时候来使用它,下面三种情况是使用CTE简化你的T-SQL语句的情况: 查询需要递归 查询中有多个子查询,或者你有重复的相同的子查询在单一语句中。

    1.4K10

    PostgreSQL-模糊查询

    函数已改进,请使用新版本函数,参看PostgreSQL 黑科技-递规二分法切分汉字 1 模糊查询时,大多数情况下首先想到的是like ‘%关键字%’或基于gin索引的正则表达式,gin至少需要三个字符才会使用索引.... 3.2 历史数据的维护工作不好处理.新增关键词时,历史数据并不包含些新的关键词,使用新关键词查询时无法查询到历史数据. 4 不使用like/不使用正则/不使用分词并保证查询快捷准确的另一种方法 此方法的缺点是比较浪费空间...as( select f from unnest(v_txts) as f group by f ),cte2 as( select f from cte1 order by f...--test_cond的数据通过触发器更新,不需要操作这个 create unlogged table test_cond( objectid bigserial not null, -...v_result; end; $$ language plpgsql strict immutable; 5.2 模糊数据 关键字字数越多,查询越准确,并且查询速度 --因优先级问题,此语句可能会

    2.5K20

    Mysql8.0 新特性 窗口函数 公共表表达式

    有的情况下会认为他是第三名就出现了排名:1、1、3 -- 使用RANK()函数获取 goods 数据类别为“女装/女士精品”的价格最高的4款商品信息 -- 并进行排序: -- 相同价格的商品并列排序...比较常用,方便使用且重要: LAG(expr,n) 返回当前行的前n行的expr的值: 这个函数很重要,它可以完成很多高级的功能,比如获取到,返回当前行的前n行的expr的值 -- LAG(要获取的列,...:CTE别名之前加一个 RECURSIVE关键字; RECURSIVE(中译:就是递归循环的意思) WITH RECURSIVE CTE名称 AS (子查询) SELECT|DELETE|UPDATE...,递归返回。...在最后的查询,选出所有代次大于等于 3 的人,他们肯定是第三代及以上代次的下属了,也就是 下下属了 WITH RECURSIVE cte AS ( -- 种子查询,找到第一代领导 SELECT employee_id

    12410

    Postgresql源码(50)语法解析时关键字判定原理(函数名不能使用的关键字为例)

    normalize int; BEGIN RETURN x; END; $$ LANGUAGE plpgsql; postgres=# CREATE FUNCTION 关键字出现在函数名...这些标识符主要是给lex使用的,在lex匹配到正则规则时,返回其中一个token。...所有的关键字都在gram.y文件中使用%token表示了,这些关键字应该都不能用于 名、列名等对象名等,可能会造成shift/reduce冲突。...col_name_keyword:可用于列名、名,但不能用于函数名。 type_func_name_keyword:可用于函数名、类型名。...增加方法:先确定新增关键字会不会造成语法冲突歧义等,加到上面5个list,然后根据能否用于名、列名、as等场景,在kwlist增加即可。

    79130

    进阶数据库系列(十一):PostgreSQL 存储过程

    因为自定义函数和存储过程进行了预编译并存储在数据库服务器。 可重用性。存储过程和函数的功能可以被多个应用同时使用。 作为脚本使用产品的 liquibase , 清理或修复数据将非常好用。...由官方文档:http://postgres.cn/docs/12/sql-createfunction.html得到的定义一个函数的语法,当然现实不需要所有的要素都要定义到。...VOLATILE COST 100 这个函数的结果会返回val的值,如下图: 并且在a中会插入一条数据,如下图。...; 提示信息 官方文档:http://postgres.cn/docs/12/plpgsql-errors-and-messages.html 使用raise语句报告消息以及抛出错误,上面给的示例已经有部分给出...VOLATILE COST 100 案例四:为了使函数更加通用,以解决动态返回数据集的问题,将名作为参数传进去。

    3.3K21
    领券