由于使用SQL2000的时间太长了,我对常用表表达式并没有太多的了解。
我给here (#4025380)和here (#4018793)的答案是相反的,因为他们没有使用CTE。
我很欣赏对于递归,它们是beez kneez,有一些查询可以通过使用它们来极大地简化,但在什么情况下,它们的使用只是轻浮的?与子查询或连接相比,它们是否有很大的性能优势?它们真的简化了代码并使其更易于维护吗?
简而言之,什么时候使用CTE而不是“lesser”语法是一个好的实践。
发布于 2010-10-28 04:53:21
在以下情况下,您通常应该使用CTE而不是普通子查询:
简而言之,是的,如果使用得当,它们确实会使查询更具可读性。
发布于 2010-10-28 05:03:35
就我个人而言,一旦我习惯于使用它们,我认为它们会产生更干净、更具可读性的代码。例如,在#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-28 04:54:05
它们是语法糖,除了分层/递归查询。
然而,并不是所有可以递归完成的事情都应该是递归的--通过递归CTE生成日期并不比游标好多少-- NUMBERS表的伸缩性要好得多。
https://stackoverflow.com/questions/4037582
复制相似问题