CTE top - order by子句并不总是有效

时间:2014-02-28 14:36:24

标签: sql tsql sql-server-2012 common-table-expression derived-table

我有以下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每次都没有返回正确的结果吗?

2 个答案:

答案 0 :(得分:0)

CTE构造中不允许使用ORDER BY。请参阅此处的备注部分:MSDN。作为CTE_QUERY_DEFINITION的一部分提供订单。我很惊讶SQL服务器甚至让你运行它。

答案 1 :(得分:0)

正如Martin Smith在他的评论中指出的那样:

  

ColumnC是唯一的吗?如果不是,您将需要添加保证唯一   ORDER BY的列作为确定的平局   确定性结果。

CTE本身没有任何问题 - 问题是我没有按unique列排序。