복붙노트

[SQL] SQL 서버에서 재귀 쿼리

SQL

SQL 서버에서 재귀 쿼리

나는 다음과 같은 구조의 테이블이

테이블 이름 : 일치

기본적으로 저장하는 해당 제품은 제품의 일치이다. 나는이 테이블을 처리해야 그리고 다음과 같은 그룹 테이블에 저장합니다.

테이블 이름 : 그룹

GROUP_ID은 그룹을 형성 Product_IDS의 MIN PRODUCT_ID를 저장한다. 예하자 발언권을 부여하려면

A가 B와 일치하고, B는 C 매칭되는 경우, 세 개의 행 (A, A) 형식 그룹 테이블로 이동한다 (A, B), (A, C)

나는 상관 하위 쿼리 및 CTE를 찾고 있지만이 구현 못하고 시도했다.

나는 모든 SQL에서이 작업을 수행해야합니다.

도와 주셔서 감사합니다 .

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    ;WITH CTE
    AS
    (
        SELECT DISTINCT
            M1.Product_ID Group_ID,
            M1.Product_ID
        FROM matches M1
            LEFT JOIN matches M2
                ON M1.Product_Id = M2.matching_Product_Id
        WHERE M2.matching_Product_Id IS NULL
        UNION ALL
        SELECT
            C.Group_ID,
            M.matching_Product_Id
        FROM CTE C
            JOIN matches M
                ON C.Product_ID = M.Product_ID
    )
    SELECT * FROM CTE ORDER BY Group_ID
    

    당신은 제어 재귀 깊이 OPTION (MAXRECURSION의 N)를 사용할 수 있습니다.

    SQL 뿐인 DEMO

  2. ==============================

    2.이런 식으로 뭔가 (테스트되지 않음)

    이런 식으로 뭔가 (테스트되지 않음)

    with match_groups as (
    
      select product_id, 
             matching_product_id,
             product_id as group_id
      from matches
      where product_id not in (select matching_product_id from matches)
    
      union all
    
      select m.product_id, m.matching_product_id, p.group_id
      from matches m
        join match_groups p on m.product_id = p.matching_product_id
    )
    select group_id, product_id
    from match_groups
    order by group_id;
    
  3. ==============================

    3.재귀 수준의 샘플 :

    재귀 수준의 샘플 :

    DECLARE @VALUE_CODE AS VARCHAR(5);
    
    --SET @VALUE_CODE = 'A' -- Specify a level
    
    WITH ViewValue AS
    (
        SELECT ValueCode
        , ValueDesc
        , PrecedingValueCode
        FROM ValuesTable
        WHERE PrecedingValueCode IS NULL
        UNION ALL
        SELECT A.ValueCode
        , A.ValueDesc
        , A.PrecedingValueCode 
        FROM ValuesTable A
        INNER JOIN ViewValue V ON
            V.ValueCode = A.PrecedingValueCode
    )
    
    SELECT ValueCode, ValueDesc, PrecedingValueCode
    
    FROM ViewValue
    
    --WHERE PrecedingValueCode  = @VALUE_CODE -- Specific level
    
    --WHERE PrecedingValueCode  IS NULL -- Root
    
  4. from https://stackoverflow.com/questions/14518090/recursive-query-in-sql-server by cc-by-sa and MIT license