首页 文章

CTE或CTE

提问于
浏览
26

一直坚持使用SQL2000太长时间了,我并没有真正接触过Common Table Expressions .

我给出的答案是here (#4025380)here (#4018793),因为他们没有使用CTE而违背了这一流程 .

我很感激,对于递归它们是beez kneez,并且有一些查询可以通过它们的使用大大简化,但在什么时候它们的使用只是轻浮?与子查询或联接相比,它们是否具有很好的性能优势?他们真的简化了代码并使其更易于维护吗?

简而言之,何时使用CTE而不是'较小'语法是一种好习惯 .

4 回答

  • 18

    在以下情况下,通常应使用CTE而非普通子查询:

    • 您的查询需要递归(如您所述)

    • 子查询很大或很复杂

    • 包含的查询很大或很复杂

    • 重复子查询(或者通过对公共子查询执行不同的简单操作,可以简化至少几个子查询)

    简而言之,是的,它们确实使得查询在使用得当时更具可读性 .

  • 3

    就个人而言,一旦我习惯使用它们,我认为它们可以生成更清晰,更易读的代码 . 举个例子,在#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
    
  • 2

    它们是语法糖,但分层/递归查询除外 .

    然而,并非所有可递归完成的事情都应该是 - 通过递归CTE生成日期几乎不比光标更好 - NUMBERS表技巧缩放得更好 .

  • 22

    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

相关问题