programing

여러 번 반복되는 SQL CTE 재귀

stoneblock 2023. 8. 7. 22:18

여러 번 반복되는 SQL CTE 재귀

CTE 재귀를 이해하는 데 문제가 있습니다.이항 계수를 계산하려고 합니다.어떤 범위의 모든 값을 가진 테이블(예: (4,2)을 생성하는 테이블(예: (3,2)과 (3,1) 등)과 모든 것을 합한 두 번째 테이블이 필요합니다.길을 잃었어요 - n 뿐만 아니라 k도 반복해야 합니다.그리고 (0,0)으로 시작한 다음 (1,0) (이전 계산을 사용하여 계산), (1,1), (2,0), (2,1)로 시작하면 좋을 것입니다.중요한 것은 저는 그것을 어떻게 하는지 전혀 모른다는 것입니다.CTE를 두 개 만들어봤는데 둘 다 어떻게 반복해야 할지 모르겠어요.그렇게 하는 요령이 있습니까?또한, 저는 (n,0)으로 시작해서 (n,1), (n,2)로 시작할 수도 있다고 생각했습니다. 하지만 그러기 위해서는 다른 이항 계수도 필요합니다.만약 이것이 여기에 관련이 있다면, 저는 Mariadb를 사용하고 있습니다.

편집: 여기 제가 쓴 것이 있습니다(분명히 효과가 없습니다, 저는 재귀를 만지작거리고 싶었습니다).

WITH RECURSIVE
kiterate (n, k, res) AS
(
SELECT 0, 0, 1 
UNION ALL 
SELECT n, k+1, 0 -- there should be result 
FROM kiterate WHERE n < k
)
SELECT * FROM kiterate;

하지만 저는 그런 것을 얻고 싶습니다.제가 해야 할 일은 결과를 만들어내는 것입니다.그러기 위해서는 (0,0)에 도달할 때까지 거의 모든 것을 계산해야 합니다(또는 필요하지 않을 수도 있습니다).제가 이해하지 못하는 것은 n과 k를 반복하는 방법입니다.위에서 언급한 바와 같이 (4,2) 계산을 하려면 (0,0), (1,0), (1,1), (2,0), (2,1), (2,2), (3,0), (3,1), (3,2), (3,3)이 필요합니다. (이 모든 것인지는 모르겠지만 당신이 이해하기를 바랍니다.)그래서 나는 n과 k를 바꿔야 합니다.하지만 동시에 그렇지는 않습니다.만약 진술이 좋다면 좋겠지만 여기서는 그렇지 않다고 꽤 확신합니다.

문제는 SQL에서 이항 계수를 계산하는 방법입니다.의 일반적인 공식은C(n, k)이라n! / k! / (n - k)!.

SQL에서는 다음과 같이 각 요인에 대해 하나의 재귀 CTE를 사용합니다.

with recursive 
    params as (select 4 n, 2 k),
    r1 as (
        select n, n res from params
        union all select n - 1, res * (n - 1) from r1 where n > 1
    ),
    r2 as (
        select k, k res from params
        union all select k - 1, res * (k - 1) from r2 where k > 1
    ),
    r3 as (
        select (n - k) m, (n - k) res from params 
        union all select m - 1, res * (m - 1) from r3 where m > 1
    )
select max(r1.res) / max(r2.res) / max(r3.res) 
from r1
cross join r2
cross join r3   

paramsCTE는 계산을 위한 매개변수를 제공합니다 - 여기서는,C(4, 2)그런 다음 세 개의 CTE가 각각 하나의 요인을 계산하고 외부 쿼리가 최종 계산을 수행합니다.

DB Fiddle에 대한 데모:C(4, 2)이라6.

언급URL : https://stackoverflow.com/questions/64688023/sql-cte-recursive-with-multiple-iterations