首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到CTE或不到CTE

到CTE或不到CTE
EN

Stack Overflow用户
提问于 2010-10-28 04:47:38
回答 4查看 6K关注 0票数 27

由于使用SQL2000的时间太长了,我对常用表表达式并没有太多的了解。

我给here (#4025380)here (#4018793)的答案是相反的,因为他们没有使用CTE。

我很欣赏对于递归,它们是beez kneez,有一些查询可以通过使用它们来极大地简化,但在什么情况下,它们的使用只是轻浮的?与子查询或连接相比,它们是否有很大的性能优势?它们真的简化了代码并使其更易于维护吗?

简而言之,什么时候使用CTE而不是“lesser”语法是一个好的实践。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-28 04:53:21

在以下情况下,您通常应该使用CTE而不是普通子查询:

  • 您的查询需要递归(如您所述)
  • 包含的查询是大的或复杂的
  • 子查询是重复的(或者至少可以通过对公共子查询执行不同的简单操作来简化多个子查询)

简而言之,是的,如果使用得当,它们确实会使查询更具可读性。

票数 26
EN

Stack Overflow用户

发布于 2010-10-28 05:03:35

就我个人而言,一旦我习惯于使用它们,我认为它们会产生更干净、更具可读性的代码。例如,在#4018793上将你的答案与我的答案进行比较。我们基本上做了同样的事情;我使用了CTE,而你没有。

没有CTE的答案:

代码语言:javascript
复制
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的回答是:

代码语言:javascript
复制
;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
票数 20
EN

Stack Overflow用户

发布于 2010-10-28 04:54:05

它们是语法糖,除了分层/递归查询。

然而,并不是所有可以递归完成的事情都应该是递归的--通过递归CTE生成日期并不比游标好多少-- NUMBERS表的伸缩性要好得多。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4037582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档