我有一个公司表,包含三列: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/