我有以下T-SQL语句:
;WITH DataSource ([ColumnA]) AS
(
SELECT TOP 100 [ColumnA]
FROM [dbo].[TEST]
WHERE [ColumnB] = 40
ORDER BY [ColumnC] DESC
)
SELECT [ColumnA]
,COUNT([ColumnA])
FROM DataSource
GROUP BY [ColumnA]
根本没有回复相同的结果。我无法理解方式,但有时候CTE中的T-SQL语句没有返回正确的值是因为这种不同的结果是产生的,不是每次都有,但有时候(为了更准确我得到三个不同的结果)
如果我只执行以下声明:
SELECT TOP 100 [ColumnA]
FROM [dbo].[TEST]
WHERE [ColumnB] = 40
ORDER BY [ColumnC] DESC
我每次都得到相同的结果。如果我使用派生表也没有问题:
SELECT [ColumnA]
,COUNT([ColumnA])
FROM
(
SELECT TOP 100 [ColumnA]
FROM [dbo].[TEST]
WHERE [ColumnB] = 40
ORDER BY [ColumnC] DESC
) DataSource
GROUP BY [ColumnA]
有人可以解释为什么CTE每次都没有返回正确的结果吗?
答案 0 :(得分:0)
CTE构造中不允许使用ORDER BY。请参阅此处的备注部分:MSDN。作为CTE_QUERY_DEFINITION的一部分提供订单。我很惊讶SQL服务器甚至让你运行它。
答案 1 :(得分:0)
正如Martin Smith
在他的评论中指出的那样:
ColumnC是唯一的吗?如果不是,您将需要添加保证唯一 ORDER BY的列作为确定的平局 确定性结果。
CTE
本身没有任何问题 - 问题是我没有按unique
列排序。