Cte

遞歸 CTE 的案例是什麼?

  • November 29, 2021

我正在尋找為什麼要使用遞歸 CTE 的範例,但我在網路搜尋中發現的幾十個範例基本上減少到兩個:

  • 生成序列
  • 遍歷員工層次結構

我確實找到了一個使用遞歸 CTE 用逗號分割字元串的範例,這是迄今為止最有趣的(db<>fiddles: SQL ServerPostgres)。

是否存在基本上不是上述之一的遞歸 CTE 範例?

以下是三個不涉及生成序列或遍歷員工層次結構的應用程序:

  1. 如何計算 SQL 中輸入字元串的所有分組排列?
  2. 總結以前日期的所有唯一值
  3. 有效地獲取每組的前兩行

Paul White 巧妙地使用了尋找不同的值


遍歷員工層次結構

這是一種更廣泛類型的問題,稱為樹問題。與迭代相反,遞歸 CTE 擅長以更有效和更相關的方式解決樹問題。

展示父子關係的其他類似範例是製造業中的 BOM(物料清單)爆炸、祖先問題中的實際父子孫關係、任何其他層次結構問題等。樹問題有些普遍。遞歸 CTE 非常有用(在質量超過使用數量方面)。

查看 explainextended.com - 您可以使用 RECURSIVE CTE 玩棋盤遊戲、繪製立體圖和 Mandelbrot 集(以及其他分形)、解析生活遊戲中的各種模式、編寫 GIF 解碼器…… SQL 就像詩歌,一個只限於一個人的想像力!

複雜問題

您可以使用遞歸子查詢來解決數獨難題

甲骨文語法

with x( s, ind ) as
( select sud, instr( sud, ' ' )
 from ( select '53  7    6  195    98    6 8   6   34  8 3  17   2   6 6    28    419  5    8  79' sud from dual )
 union all
 select substr( s, 1, ind - 1 ) || z || substr( s, ind + 1 )
      , instr( s, ' ', ind + 1 )
 from x
    , ( select to_char( rownum ) z
        from dual
        connect by rownum &lt;= 9
      ) z
 where ind &gt; 0
 and not exists ( select null
                  from ( select rownum lp
                         from dual
                         connect by rownum &lt;= 9
                       )
                  where z = substr( s, trunc( ( ind - 1 ) / 9 ) * 9 + lp, 1 )
                  or    z = substr( s, mod( ind - 1, 9 ) - 8 + lp * 9, 1 )
                  or    z = substr( s, mod( trunc( ( ind - 1 ) / 3 ), 3 ) * 3
                                     + trunc( ( ind - 1 ) / 27 ) * 27 + lp
                                     + trunc( ( lp - 1 ) / 3 ) * 6
                                  , 1 )
                )
)
select s
from x
where ind = 0

其他

我想你可以將它用於任何迭代過程,如曲線擬合。

但是,我發現將曲線擬合過程解除安裝到 R 之類的東西更有效。

引用自:https://dba.stackexchange.com/questions/303180