一直坚持使用SQL2000太长时间了,我并没有真正接触过Common Table Expressions .
我给出的答案是here (#4025380)和here (#4018793),因为他们没有使用CTE而违背了这一流程 .
我很感激,对于递归它们是beez kneez,并且有一些查询可以通过它们的使用大大简化,但在什么时候它们的使用只是轻浮?与子查询或联接相比,它们是否具有很好的性能优势?他们真的简化了代码并使其更易于维护吗?
简而言之,何时使用CTE而不是'较小'语法是一种好习惯 .
4 回答
在以下情况下,通常应使用CTE而非普通子查询:
您的查询需要递归(如您所述)
子查询很大或很复杂
包含的查询很大或很复杂
重复子查询(或者通过对公共子查询执行不同的简单操作,可以简化至少几个子查询)
简而言之,是的,它们确实使得查询在使用得当时更具可读性 .
就个人而言,一旦我习惯使用它们,我认为它们可以生成更清晰,更易读的代码 . 举个例子,在#4018793上比较你对我的回答 . 我们基本上做了同样的事情;我使用过CTE但你没有 .
你的答案没有CTE:
我对CTE的回答是:
它们是语法糖,但分层/递归查询除外 .
然而,并非所有可递归完成的事情都应该是 - 通过递归CTE生成日期几乎不比光标更好 - NUMBERS表技巧缩放得更好 .
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