【问题标题】:How do I avoid using a while loop here?如何避免在这里使用 while 循环?
【发布时间】:2012-08-20 08:14:14
【问题描述】:

作为一个从未从任何人那里得到过 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

此代码的目的是构建一个表,将记录与其最远的父记录连接起来,并将其插入到一个表中,以便在查询的其他地方引用。

【问题讨论】:

    标签: sql loops stored-procedures while-loop


    【解决方案1】:

    我没有要测试的数据,所以请告诉我,如果您按照这些思路运行会发生什么。 应该可以使用 group by 和聚合。 如果您提供示例数据,我可能会提供更多帮助。

         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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      相关资源
      最近更新 更多