1

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

4

2 回答 2

0

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

于 2014-03-03T16:56:00.153 回答
0

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

ColumnC 是独一无二的吗?如果不是,您将需要向 ORDER BY 添加一个保证唯一的列,以充当决胜局以确保确定性结果。

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

于 2014-03-24T21:26:37.987 回答