0

SQL に関して誰からも指示や指示を受けたことがない人として、次のクエリをどのように作成する必要があるかを皆さんから聞きたいと思います。私が聞いたところによると、このようなループは非常にひどい方法です。

これからクエリ内にテーブルを作成しています:

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

このコードの目的は、レコードを最も遠い親レコードに接続するテーブルを作成し、それをテーブルに挿入して、クエリの他の場所で参照できるようにすることです。

4

1 に答える 1

0

テストするデータがないので、これらの線に沿って何かを実行するとどうなるか教えてください。groupbyとaggregatesを使用して可能にする必要があります。あなたがサンプルデータを提供するならば、私はもっと助けることができるかもしれません。

     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
于 2012-08-24T19:42:18.317 に答える