我已经开始阅读有关常用表表达式的内容,但我想不出有哪种用例需要使用它们。它们似乎是多余的,因为派生表也可以做同样的事情。我是不是遗漏了什么或者理解得不够透彻?谁能给我举一个简单的例子,说明使用常规的select、派生或临时表查询来实现CTE的限制?任何简单的例子都会受到高度赞赏。
发布于 2011-01-20 05:10:13
例如,如果您需要多次引用/联接相同的数据集,可以通过定义CTE来实现。因此,它可以是代码重用的一种形式。
自引用的一个例子是递归:Recursive Queries Using CTE
有关激动人心的Microsoft定义Taken from Books Online:
CTE可用于:
发布于 2011-01-20 05:08:59
我使用它们来分解复杂的查询,特别是复杂的连接和子查询。我发现我越来越多地使用它们作为“伪视图”来帮助我理解查询的意图。
我对它们唯一的抱怨是它们不能被重用。例如,我可能有一个存储的proc,其中包含两个可以使用相同CTE的update语句。但是CTE的“作用域”只是第一个查询。
问题是,“简单的例子”可能并不真正需要CTE!
不过,还是很方便的。
发布于 2012-11-15 01:19:00
我认为使用cte有两个原因。
在where子句中使用计算值。在我看来,这比派生表要干净一些。
假设有两个表-通过Questions.ID = Answers.Question_Id (和测验id)连接在一起的问题和答案
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
这是我想要获取问题和答案列表的另一个示例。我希望答案与结果中的问题分组。
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
https://stackoverflow.com/questions/4740748
复制相似问题