【问题标题】:How to restrict recursive CTE row count如何限制递归 CTE 行数
【发布时间】:2014-08-04 15:49:35
【问题描述】:

我有一个用来生成记录ID的函数,我想使用CTE来获取一批记录ID。 现在递归 CTE 如下所示

  with T as (
    select 
        dbo.Ufn_GetRecordId() AS recordId
    union all
    SELECT
        dbo.Ufn_GetRecordId() AS recordId
    FROM T

)select * from T
OPTION (MaxRecursion 0);

但是,此查询不会终止。如何限制 CTE 的计数?(例如,如果我在 T 中只需要 3 行)

【问题讨论】:

    标签: sql recursion common-table-expression


    【解决方案1】:

    这是一种使用递归 CTE 生成 N 行的相当标准的方法。

    WITH T 
         AS (SELECT 1 AS Dummy 
             UNION ALL 
             SELECT Dummy + 1 
             FROM   T 
             WHERE  Dummy < 3) 
    SELECT dbo.Ufn_GetRecordId() AS RecordId 
    FROM   T; 
    

    如果您需要生成超过 100 个数字,则需要 OPTION (MAXRECURSION 0)(或一些合适的值,而不是 0)。

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法。想法取自SQL Server: How to limit CTE recursion to rows just recursivly added?

      with T as (
          select 
              dbo.Ufn_GetRecordId() AS recordId, 1 as testnum
          union all
          SELECT
              dbo.Ufn_GetRecordId() AS recordId, testnum + 1
          FROM T
          WHERE testnum < 3
      
      )select * from T
      OPTION (MaxRecursion 0);
      

      这将限制为 3 个返回的行。

      【讨论】:

      • &lt;= 3 将选择四行。
      • @ta.speot.is,这是一个错误。我的意思是&lt; 3。已编辑并感谢您的指点。
      • @Rahul 感谢您的回答。我最终决定使用“WHILE”语句来归档它。经过比较,“WHILE”似乎比“CTE”读取的逻辑更少
      • @jojo,是的,CTE 会比循环更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2013-05-24
      • 2014-10-18
      • 2023-04-06
      相关资源
      最近更新 更多