关于递归SQL查询,它们的性能和无限递归

问题描述 投票:0回答:1

我想构造一个“递归”查询以在我的PostgreSQL数据库上使用,这个想法像您想象的一样基本:)

SELECT sourceid, destinationid   FROM trail.log
WHERE sourceid = 'T0'
OR sourceid in (SELECT destinationid FROM trail.log where sourceid ='T0')
OR sourceid in (SELECT destinationid FROM trail.log where sourceid in ( you see where I want to go ... )
OR ...

根据互联网,这是我应该做的:

WITH cte_traillog AS (
    SELECT       
        sourceid, destinationid       
    FROM       
        trail.log
    WHERE sourceid = 'T0'
    UNION ALL
    SELECT 
        e.sourceid, e.destinationid
    FROM 
        trail.log e
        INNER JOIN cte_org o 
            ON o.destinationid = e.sourceid
)
SELECT * FROM cte_traillog;

知道第一个查询在不到一分钟的时间内在我的服务器上答复,第二个查询的性能是否相同?(下面是一些可能很愚蠢的问题)如果我的第一个查询没有造成太大麻烦,是否有第二个查询会使服务器崩溃的风险?如果数据将导致无限循环该怎么办?有没有办法防止无限循环?更笼统地说,这是正确的方法吗?

提前感谢您的时间。

祝您有美好的一天。

postgresql recursive-query
1个回答
0
投票

您的查询中有一个错误:您在递归分支中引用CTE时使用了错误的名称。除此之外,您的查询看起来还不错。

© www.soinside.com 2019 - 2024. All rights reserved.