-
26-09-2019 - |
题
由于长期使用 SQL2000,我并没有真正接触过公共表表达式。
我给出的答案 这里(#4025380) 和 这里(#4018793) 违背了潮流,因为他们没有使用 CTE。
我很欣赏它们对于递归来说是最重要的,并且有一些查询可以通过它们的使用而大大简化,但是在什么时候它们的使用只是无聊的呢?与子查询或联接相比,它们是否具有巨大的性能优势?它们真的简化了代码并使其更易于维护吗?
简而言之,什么时候使用 CTE 而不是“较小”语法是好的做法。
解决方案
如果出现以下情况,您通常应该在普通子查询上使用 CTE:
- 您的查询需要递归(正如您所指出的)
- 子查询很大或很复杂
- 包含的查询很大或很复杂
- 子查询重复(或者至少可以通过对公共子查询执行不同的简单操作来简化几个子查询)
简而言之,是的,如果使用得当,它们确实会使查询更具可读性。
其他提示
就个人而言,当我使用它们得到了舒服,我认为他们生产更清洁,更可读的代码。作为一个例子,比较你的答案矿上#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
它们是语法糖,具有分层/递归查询除外。
然而,并不是唯一可以递归做应该是一切 - 通过递归CTE日期代只是比光标更好 - 数字表伎俩比例要好得多
CTE产生以递归场景更快的结果。 CTE的结果被反复使用,能够得到最终的结果集。所以,既然你已经采取的其中CTE条款或子查询,肯定它会显示性能的改善。结果 参考: http://msdn.microsoft.com/ EN-US /库/ ms190766(v = SQL.105)的.aspx
刚一说明,在许多情况下,临时表提供更好的性能,然后CTE也,所以你应该给一个尝试到临时表为好。结果 参考: HTTP://social.msdn .microsoft.com /论坛/ EN / TRANSACTSQL /线程/ d040d19d-016E-4a21-bf44-a0359fb3c7fb