SQL - 为什么要使用CTE?

时间:2015-04-27 15:30:52

标签: sql-server

所以,我是一名中级SQL开发人员,最近我看到围绕CTE(Common Table Expressions)的大量讨论。在我看的每一个地方,我都看到人们说这是一件令人惊奇的事情:

  

CTE(公用表表达式)是SQL Server最美观和最强大的功能之一,对SQL Server开发人员来说是非常有用的。这些不仅简化了T-SQL中的大多数复杂操作,而且还做了很多人可以想象的事情。

     

Microsoft Technet关于使用CTE的文章的用户评论。

从我自己看到的和在线阅读,CTE基本上只是一个自我填充的"临时表只能使用一次。我看到的唯一好处是CTE可以清理自己,不同于绑定到会话的临时表。我也看过很多关于递归的评论,但从未遇到过我需要使用它的情况;我觉得这对某种类型的问题非常具体?

简而言之: CTE是否具有严重的间接性,还是我错过了一些非常强大的东西?我还没有看到在临时表上使用CTE有什么好处。

2 个答案:

答案 0 :(得分:2)

CTE通常被认为比使用临时表更具可读性,尽管这可能是一个品味问题。但是,更重要的是,CTE可以是自引用的,甚至可以在同一查询中多次引用。这允许开发递归查询,这是查询分层数据结构时非常强大的功能。

但是,作为警告,使用CTE时通常会产生性能开销,特别是在一次查询中使用多个CTE时。使用具有合适索引的临时表通常更快,也请参阅@ bogdan-bogdanov comment。

答案 1 :(得分:0)

在考虑查询的运行方式时,应该将子查询视为在外部查询之前运行。因此,当您跳过并在心理上考虑每个子查询的结果集时,复杂查询可能难以阅读和理解。它还使得对嵌套子查询进行注释/记录变得突兀。

当您将子查询移动到CTE时,这会更好地表示,因为它变为自上而下的列表,而不是嵌套的子查询。它使查看查询的流更容易,因为顶部查询返回的结果通常随后从后面的查询中引用。这使得评论每个CTE更容易描述其具体目的。