27

あまりにも長い間 SQL2000 を使い続けてきたので、共通テーブル式にはあまり触れていません。

私がここ (#4025380)ここ (#4018793)で示した回答は、CTE を使用しなかったという点でフローに反しています。

再帰の場合、それらは非常に簡単であり、それらを使用することで大幅に簡素化できるクエリがいくつかあることを理解していますが、どの時点でそれらの使用が軽薄になるのでしょうか? サブクエリや結合よりも優れたパフォーマンス上の利点がありますか? それらは本当にコードを簡素化し、より保守しやすくしていますか?

要するに、「より少ない」構文よりもCTEを使用するのが良い方法はいつですか。

4

4 に答える 4

26

次の場合は、通常、通常のサブクエリよりもCTEを使用する必要があります。

  • クエリには再帰が必要です(ご指摘のとおり)
  • サブクエリが大きいか複雑
  • 含まれているクエリが大きいか複雑
  • サブクエリが繰り返されます(または、共通のサブクエリに対してさまざまな単純な操作を実行することで、少なくともいくつかのサブクエリを簡略化できます)

要するに、そうです、よく使用するとクエリが読みやすくなります。

于 2010-10-27T20:53:21.270 に答える
20

個人的には、それらを快適に使用できるようになると、よりクリーンで読みやすいコードが生成されると思います。例として、 #4018793の回答と私の回答を比較してください。基本的に同じことをしました。私は CTE を使用しましたが、あなたは使用しませんでした。

CTEなしのあなたの答え:

SELECT
    course,
    section,
    grade,
    gradeCount
FROM
    table
INNER JOIN
    (SELECT
        grade,
        Max(gradeCount) as MaxGradeCount
    FROM
        table
    ) MaxGrades
    ON  table.grade = MaxGrades.grade
        AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY 
    table.grade

CTEでの私の答え:

;with cteMaxGradeCount as (
    select 
        grade, 
        max(gradeCount) as MaxGradeCount
    from @Test
    group by grade
)
select 
    t.course, 
    t.SECTION, 
    t.grade, 
    t.gradeCount
from cteMaxGradeCount c
inner join @Test t
    on  c.grade = t.grade
        and c.MaxGradeCount = t.gradeCount
order by t.grade
于 2010-10-27T21:03:34.787 に答える
4

They are syntactic sugar, with the exception of hierarchical/recursive queries.

However, not everything that can be done recursively should be - date generation via recursive CTE was barely better than a cursor -- the NUMBERS table trick scaled much better.

于 2010-10-27T20:54:04.910 に答える
2

CTE は、再帰的なシナリオでより高速な結果をもたらします。CTE の結果は、最終的な結果セットを取得するために繰り返し使用されます。したがって、CTE で where 句またはサブクエリを取得したので、間違いなくパフォーマンスの向上が見られます。
参考: http: //msdn.microsoft.com/en-us/library/ms190766 (v=sql.105).aspx

多くのシナリオでは、CTE よりも一時テーブルの方がパフォーマンスが優れているため、一時テーブルも試してみてください。
参照 : http://social.msdn.microsoft.com/Forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb

于 2012-07-21T14:50:01.013 に答える