我正在使用Microsoft SQL Server 2008 (SP3) - 10.0.5520.0 (X64)标准版(64位)在Windows NT 6.0上(Build 6002:Service Pack 2)
描述:
[ORC_RESULT]
和GROUPING_SELECT
是CTE
表。
我遇到了关于CTE(公共表达式)的奇怪错误。
SELECT a.keysbor
--,gs.[rank]
FROM [ORC_RESULT] AS a inner JOIN GROUPING_SELECT AS gs
ON a.keysbor = gs.keysbor
WHERE gs.[RANK] = 1
ORDER BY a.keysbor
结果 36 行(无重复行)
SELECT a.keysbor
,gs.[rank]
FROM [ORC_RESULT] AS a inner JOIN GROUPING_SELECT AS gs
ON a.keysbor = gs.keysbor
WHERE gs.[RANK] = 1
ORDER BY a.keysbor
结果29行
Q:为什么只有在SELECT
语句中存在 gs.[rank]
字段时,筛选器 gs.[RANK] = 1
才会应用?
without gs.[rank] with gs.[rank] rank
10072002992443 10072002992443 1
10072002992444 10072002992444 1
10072002992445 10072002992445 1
10072002992446 10072002992446 1
10072002992447 10072002992447 1
10072002992448 10072002992448 1
10072002992449 10072002992449 1
10072002992450 10072002992450 1
10072002992451 10072002992451 1
10072002992452 10072002992452 1
10072002992453 10072002992453 1
10072002992454 10072002992454 1
10072002992455 10072002992455 1
10072002992456 10072002992456 1
10072002992457 10072002992457 1
10072002992458 10072002992458 1
10072002992459 10072002992459 1
10072002992460 10072002992460 1
10072002992461 2
10072002992462 2
10072002992463 2
10072002992464 2
10072002992465 2
10072002992466 2
10072002992467 2
10072002992736 10072002992736 1
10072002992866 10072002992866 1
10072002992867 10072002992867 1
10072002992868 10072002992868 1
10072002992869 10072002992869 1
10072002992870 10072002992870 1
10072002992871 10072002992871 1
10072002992872 10072002992872 1
10072002992873 10072002992873 1
10072002992874 10072002992874 1
10072002992875 10072002992875 1
ROW_NUMBER()
生成的列使用名称“RANK”有点混淆,因为还有另一个可以在同一位置使用的函数称为“RANK()”。无法完全分析您的整个查询,但这将归结为您的ORDER BY
子句(在窗口函数中)不够具体,以便唯一地定义其分区内行的顺序。因此,对查询进行轻微更改将生成不同的计划,并将指定不同的行为“1”。 - Damien_The_UnbelieverROW_NUMBER()
错误(尽管这些错误涉及并行性,而此查询不使用)。 - Jeroen MostertORDER BY
可能会影响返回的行数。 - Damien_The_Unbeliever