2012-08-24 7 views
0

누군가 SQL에서 지시/지시를받은 적이없는 사람으로서 다음 질문이 어떻게 이루어져야했는지 들었습니다. 내가 듣기론, 이것과 같은 루프는 일을하는 아주 끔찍한 방법입니다.여기에 while 루프를 사용하지 않으려면 어떻게해야합니까?

나는이에서 내 쿼리 내에서 테이블을 만드는거야 :

DECLARE @maxReleases int 
SET @maxReleases = 100000 

DECLARE @RootReleases table (ReleaseId int, RootReleaseId int) 

DECLARE @ctr int 
Set @ctr = 1 

WHILE(@ctr <= @maxReleases) 
BEGIN 
WITH cte_Releases 
( 
    ReleaseId, 
    Name, 
    ParentReleaseID 

) 
AS( 
    SELECT 
    ReleaseId, 
    Name, 
    ParentReleaseID 

    FROM Releases 
    Where ReleaseId = @ctr 

UNION ALL 

SELECT 
    R.ReleaseId, 
    R.Name, 
    R.ParentReleaseID 
FROM Releases R 
INNER JOIN cte_Releases ON cte_Releases.ParentReleaseID = R.ReleaseId 
) 
INSERT INTO @RootReleases 
SELECT max(ReleaseId) as ReleaseId, min(ReleaseId) as RootReleaseId FROM cte_Releases 

SET @ctr = @ctr + 1 
END 
이 코드의 목적은 자신의 가장 먼 부모 레코드 레코드를 연결하는 테이블을 구축하고, 테이블에 삽입하는 것입니다

가 참조 할 수 쿼리의 다른 부분.

답변

0

테스트 할 데이터가 없습니다.이 라인을 따라 뭔가를 실행하면 어떻게됩니까? 그룹 별 및 집계를 사용하는 것이 가능해야합니다. 샘플 데이터를 제공하면 더 많은 도움이 될 것입니다.

 DECLARE @RootReleases table (ReleaseId int, RootReleaseId int) 

; WITH cte_Releases 
( 
    ReleaseId, 
    Name, 
    ParentReleaseID 

) 
AS( 
    SELECT 
    ReleaseId, 
    Name, 
    ParentReleaseID 

    FROM Releases 
-- Where ReleaseId = @ctr 

UNION ALL 

SELECT 
    R.ReleaseId, 
    R.Name, 
    R.ParentReleaseID 
FROM Releases R 
INNER JOIN cte_Releases ON cte_Releases.ParentReleaseID = R.ReleaseId 
) 
INSERT INTO @RootReleases 
SELECT max(ReleaseId) as ReleaseId, min(ReleaseId) as RootReleaseId FROM cte_Releases 
WHERE ReleaseId BETWEEN 1 AND 100000 
GROUP BY ReleaseId 
관련 문제