[SQL] SQL 서버에서 재귀 쿼리
SQLSQL 서버에서 재귀 쿼리
나는 다음과 같은 구조의 테이블이
테이블 이름 : 일치
기본적으로 저장하는 해당 제품은 제품의 일치이다. 나는이 테이블을 처리해야 그리고 다음과 같은 그룹 테이블에 저장합니다.
테이블 이름 : 그룹
GROUP_ID은 그룹을 형성 Product_IDS의 MIN PRODUCT_ID를 저장한다. 예하자 발언권을 부여하려면
A가 B와 일치하고, B는 C 매칭되는 경우, 세 개의 행 (A, A) 형식 그룹 테이블로 이동한다 (A, B), (A, C)
나는 상관 하위 쿼리 및 CTE를 찾고 있지만이 구현 못하고 시도했다.
나는 모든 SQL에서이 작업을 수행해야합니다.
도와 주셔서 감사합니다 .
해결법
-
==============================
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.이런 식으로 뭔가 (테스트되지 않음)
이런 식으로 뭔가 (테스트되지 않음)
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.재귀 수준의 샘플 :
재귀 수준의 샘플 :
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
from https://stackoverflow.com/questions/14518090/recursive-query-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 왜 (어떻게) master..spt_values를 사용하여 열을 분할하려면? (0) | 2020.04.04 |
---|---|
[SQL] 엑셀 날짜 일련 번호 정기적으로 날짜로 변환 (0) | 2020.04.04 |
[SQL] 피벗 테이블과 연결하여 열 (0) | 2020.04.04 |
[SQL] 행에 쉼표로 구분 된 열 값을 변환 (0) | 2020.04.04 |
[SQL] SQL (ORACLE) : ORDER BY와 LIMIT [중복] (0) | 2020.04.04 |