5

私は SQL を学んでいて、次の再帰 SQL ステートメントを理解するのに苦労しました。

WITH RECURSIVE t(n) AS (
    SELECT 1
    UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;

n と t は何SELECT sum(n) FROM t;ですか? 私が理解できる限り、n は t の集合です。私は正しいですか?

また、このステートメントで再帰はどのようにトリガーされますか?

4

3 に答える 3

2

これはCommon Table Expressionまたは CTE と呼ばれます。

クエリのRECURSIVEfrom は何の意味もありません。 norのような単なる別の名前tです。物事を再帰的にするのは、名前付き CTEtが式内でそれ自体を参照することです。したがって、式の結果を生成するために、クエリ エンジンは結果を再帰的に作成する必要があり、各評価が次の評価をトリガーします。この時点に到達SELECT n+1 FROM t...し、停止して評価する必要がありtます。n < 100そのためには、条件 ( ) が成り立たなくなるまで、自分自身を再度呼び出す必要があります。はSELECT 1開始点を提供しWHERE n < 100、クエリが永久に繰り返されないようにします。

少なくとも、概念的にはそのように機能するはずです。一般的に実際に起こることは、クエリ エンジンが可能であれば再帰的にではなく反復的に結果を構築することですが、それは別の話です。

于 2013-09-17T03:58:25.363 に答える
2

これを分解しましょう:

WITH RECURSIVE t(n) AS (

シード クエリと再帰クエリを含むことになっている Common Table Expression (CTE)。CTE はtと呼ばれ、1 列を返します: n

シード クエリ:

    SELECT 1

ans 回答セット (この場合は 1 行だけ: 1) を返し、そのコピーを最終的な回答セットに入れます。

再帰部分を開始します。

    UNION ALL

シード クエリから返された行が処理され、n+1 が返され (ここでも 1 行の回答セット: 2)、最終的な回答セットにコピーされます。

    SELECT n+1 FROM t WHERE n < 100

このステップが空でない回答セット (activity_count > 0) を返した場合、それは (永遠に) 繰り返されます。

このn+1のような計算の WHERE 条件は、通常、無限の再帰を避けるために使用されます。通常、データに基づいて可能な最大レベルを知っていますが、複雑なクエリの場合、いくつかの条件を簡単に間違えてしまいます;-)

最後に、回答セットが返されます。

)
SELECT sum(n) FROM t;

単純にSELECT * FROM t;を実行すると、1 から 100 までのすべての数字が表示されますが、このリストを作成する方法はあまり効率的ではありません。

覚えておくべき最も重要なことは、各ステップが最終結果の一部を生成し、前のステップの行のみが次の再帰レベルで処理されるということです。

于 2013-09-17T10:48:46.817 に答える