172

この投稿から次の手順で ROW_NUMBER を使用するには?

回答には 2 つのバージョンがありsub-query、一方は a を使用し、もう一方は aを使用しCTEて同じ問題を解決します。

さてCTE (Common Table Expression)、「サブクエリ」よりも a を使用する利点は何ですか(したがって、クエリが実際に行っていることをより読みやすくします)

CTEオーバーを使用する唯一の利点はsub-select実際に. CTE が単純な (非再帰的な) CTE として使用される場合、これら 2 つの間に他に違いはありますか?sub-query

4

10 に答える 10

122

サブクエリと単純な(非再帰) CTE バージョンでは、おそらく非常に似ています。プロファイラーと実際の実行計画を使用して違いを見つける必要があり、それはセットアップに固有のものです (したがって、完全な答えを伝えることはできません)。

一般的に; CTE は再帰的に使用できます。サブクエリはできません。これにより、ツリー構造に特に適しています。

于 2009-04-01T19:21:09.560 に答える
100

共通テーブル式の主な利点(再帰クエリに使用しない場合) はカプセル化です。サブクエリを使用するすべての場所でサブクエリを宣言する必要がなく、一度定義するだけで複数の参照を持つことができます。それに。

ただし、これは一度だけ実行されることを意味するものではありません(この非常に答えの以前の反復に従って、コメントしてくれたすべての人に感謝します)。複数回参照された場合、クエリは間違いなく複数回実行される可能性があります。クエリ オプティマイザは、CTEをどのように解釈するかを最終的に決定します。

于 2009-04-01T19:22:27.217 に答える
17

CTEは再帰に最も役立ちます。

WITH hier(cnt) AS (
        SELECT  1
        UNION ALL
        SELECT  cnt + 1
        FROM    hier
        WHERE   cnt < @n
        )
SELECT  cnt
FROM    hier

行を返し@nます (最大101)。カレンダー、ダミー行セットなどに役立ちます。

また、読みやすくなっています (私の意見では)。

これを除けば、CTEsubqueriesは同一です。

于 2009-04-01T19:26:26.147 に答える
11

言及されていない違いの 1 つは、1 つの CTE を共用体の複数の部分で参照できることです。

于 2012-02-19T01:59:42.580 に答える
8

私が何かを見逃していない限り、CTE とサブクエリに同じように簡単に名前を付けることができます。

主な違いは読みやすさだと思います(サブクエリを途中ではなく前もって定義するため、CTEの方が読みやすいと思います)。

そして、再帰で何かをする必要がある場合、サブクエリでそれを行うのに少し苦労するでしょう;)

于 2009-04-01T19:22:10.087 に答える
6

他の人の回答に加えて、同じサブクエリを複数回使用している場合は、これらすべてのサブクエリを 1 つの CTE に置き換えることができます。これにより、コードをより適切に再利用できます。

于 2009-09-23T21:48:35.733 に答える
4

また、古いバージョンのSQL Server(はい、多くの人がSQL Server 2000データベースをサポートする必要があります)では、CTEが許可されていないため、派生テーブルが最適なソリューションであることも理解する必要があります。

于 2011-01-26T16:18:20.507 に答える
2

ヒント: (MAXRECURSION n)

句でMAXRECURSIONヒントと032,767の値を使用して、特定のステートメントで許可される再帰レベルの数を制限できます。OPTION

たとえば、次のことを試すことができます。

OPTION 
      (MAXRECURSION 150)

GO
于 2015-03-31T11:47:51.220 に答える