SQL 递归表无限循环

标签 sql sql-server recursive-query

我有一个公司表,包含三列:holder_co_id、hold_co_id、pct_owned。

holder_co_id  held_co_id  pct_owned
A             B           25
A             C           50
B             C           50
C             B           10

因此,我的查询确定 A 持有 B 的 25%,A 持有 C 的 50%,A 通过持有 C 的 50% 持有 B 的另外 5%,通过持有 B 的持有另外 12.5% 的 C。

我对自己 super super 满意,因为这一次我搞定了一些sql。这并没有持续多久。我注意到,随着 B 和 C 的共同所有权,这会将查询发送到无限循环。我尝试通过在循环上设置最大值来停止循环,但这在某些情况下仍会导致所有权高于 100%...此外,这是不正确的。

除了以下之外我还能如何做到这一点的任何想法:

WITH Result AS 
(SELECT HOLDER_CO_ID, 
        HELD_CO_ID, 
        PCT_OWNED, 
        1 AS generationsremoved
FROM dbo.ALL_HOLDING_INFO
UNION ALL
SELECT  P.HOLDER_CO_ID, 
        N.HELD_CO_ID, 
        P.PCT_OWNED * N.PCT_OWNED AS Expr1,
        P.generationsremoved + 1 AS Expr2
FROM  Result AS P INNER JOIN
dbo.ALL_HOLDING_INFO AS N ON P.HELD_CO_ID = N.HOLDER_CO_ID
WHERE     (P.generationsremoved <= 10))
SELECT DISTINCT TOP (100) PERCENT HOLDER_CO_ID, 
                                  HELD_CO_ID, 
                                  PCT_OWNED, 
                                  generationsremoved
 FROM         Result AS Result_1
 WHERE     (PCT_OWNED > 0.005)
 ORDER BY HOLDER_CO_ID, HELD_CO_ID, generationsremoved DESC

最佳答案

尝试在 CTE 的递归 block 上停止您的迭代,而不是在外部进行,我的猜测是,如果您在 SQL 尝试构建它时停止它(在内部)递归 block )它不会进入无限循环

  WITH Result AS 
    (SELECT HOLDER_CO_ID, 
            HELD_CO_ID, 
            PCT_OWNED, 
            1 AS generationsremoved
    FROM dbo.ALL_HOLDING_INFO
    UNION ALL
    SELECT  P.HOLDER_CO_ID, 
            N.HELD_CO_ID, 
            P.PCT_OWNED * N.PCT_OWNED AS Expr1,
            P.generationsremoved + 1 AS Expr2
    FROM  Result AS P INNER JOIN
    dbo.ALL_HOLDING_INFO AS N ON P.HELD_CO_ID = N.HOLDER_CO_ID
    WHERE     (P.generationsremoved<= 10)
      AND (PCT_OWNED > 0.005))
    SELECT DISTINCT TOP (100) PERCENT HOLDER_CO_ID, 
                                      HELD_CO_ID, 
                                      PCT_OWNED, 
                                      generationsremoved
     FROM         Result AS Result_1

关于SQL 递归表无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22822541/

相关文章:

Python - 从 MS SQL Server 将表插入 SQLite

c# - SQL Server SELECT 语句通过传入的字符串数组进行过滤

sql - SQL 嵌套注释背后的算法

sql - 使用 CTE 进行递归选择时出现错误 - "UNION operator must have an equal number of expressions"

mysql - 我该如何完成这个查询?

Sql select语句查找某个时间段内重复预订

mysql - 当月运行总和,累计运行总计上限

sql - 删除和更新级联不会影响 SQLite 中的子表?

sql-server - 检索以前版本的存储过程

sql - 是否可以进行递归 SQL 查询?