首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时使用通用表表达式(CTE)

何时使用通用表表达式(CTE)
EN

Stack Overflow用户
提问于 2011-01-20 05:06:02
回答 9查看 372.5K关注 0票数 251

我已经开始阅读有关常用表表达式的内容,但我想不出有哪种用例需要使用它们。它们似乎是多余的,因为派生表也可以做同样的事情。我是不是遗漏了什么或者理解得不够透彻?谁能给我举一个简单的例子,说明使用常规的select、派生或临时表查询来实现CTE的限制?任何简单的例子都会受到高度赞赏。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-01-20 05:10:13

例如,如果您需要多次引用/联接相同的数据集,可以通过定义CTE来实现。因此,它可以是代码重用的一种形式。

自引用的一个例子是递归:Recursive Queries Using CTE

有关激动人心的Microsoft定义Taken from Books Online:

CTE可用于:

  • 创建递归查询。有关更多信息,请参见不需要常规使用视图时视图的Recursive Queries Using Common Table Expressions.
  • Substitute;也就是说,您不必按从标量子选择派生的列或不确定的函数或在同一语句中多次对结果表进行外部分组的函数将定义存储在metadata.
  • Enable分组中。
票数 210
EN

Stack Overflow用户

发布于 2011-01-20 05:08:59

我使用它们来分解复杂的查询,特别是复杂的连接和子查询。我发现我越来越多地使用它们作为“伪视图”来帮助我理解查询的意图。

我对它们唯一的抱怨是它们不能被重用。例如,我可能有一个存储的proc,其中包含两个可以使用相同CTE的update语句。但是CTE的“作用域”只是第一个查询。

问题是,“简单的例子”可能并不真正需要CTE!

不过,还是很方便的。

票数 59
EN

Stack Overflow用户

发布于 2012-11-15 01:19:00

我认为使用cte有两个原因。

在where子句中使用计算值。在我看来,这比派生表要干净一些。

假设有两个表-通过Questions.ID = Answers.Question_Id (和测验id)连接在一起的问题和答案

代码语言:javascript
复制
WITH CTE AS
(
    Select Question_Text,
           (SELECT Count(*) FROM Answers A WHERE A.Question_ID = Q.ID) AS Number_Of_Answers
    FROM Questions Q
)
SELECT * FROM CTE
WHERE Number_Of_Answers > 0

这是我想要获取问题和答案列表的另一个示例。我希望答案与结果中的问题分组。

代码语言:javascript
复制
WITH cte AS
(
    SELECT [Quiz_ID] 
      ,[ID] AS Question_Id
      ,null AS Answer_Id
          ,[Question_Text]
          ,null AS Answer
          ,1 AS Is_Question
    FROM [Questions]

    UNION ALL

    SELECT Q.[Quiz_ID]
      ,[Question_ID]
      ,A.[ID] AS  Answer_Id
      ,Q.Question_Text
          ,[Answer]
          ,0 AS Is_Question
        FROM [Answers] A INNER JOIN [Questions] Q ON Q.Quiz_ID = A.Quiz_ID AND Q.Id = A.Question_Id
)
SELECT 
    Quiz_Id,
    Question_Id,
    Is_Question,
    (CASE WHEN Answer IS NULL THEN Question_Text ELSE Answer END) as Name
FROM cte    
GROUP BY Quiz_Id, Question_Id, Answer_id, Question_Text, Answer, Is_Question 
order by Quiz_Id, Question_Id, Is_Question Desc, Name
票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4740748

复制
相关文章

相似问题

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