公共表表达式中意外的解析函数输出

问题描述

在 SQL Server 2019 中,分析函数没有返回我在递归公用表表达式上下文中所期望的结果。考虑以下非递归 T-SQL 查询:

WITH SourceData (RowNum,Uniform,RowVal) AS (
  SELECT 1,'A','A' UNION ALL
  SELECT 2,'B' UNION ALL
  SELECT 3,'C' UNION ALL
  SELECT 4,'D'
),RecursiveCte0 (RowNum,RowVal,MinVal,SomeSum,RowNumCalc,RecursiveLevel) AS (
  SELECT RowNum,RowNum,CAST(RowNum AS BIGINT),0
  FROM SourceData
),RecursiveCte1 (RowNum,RecursiveLevel) AS (
  SELECT * FROM RecursiveCte0
  UNION ALL
  SELECT
    RowNum,MIN(MinVal) OVER (PARTITION BY Uniform),SUM(RowNum) OVER (PARTITION BY Uniform),ROW_NUMBER() OVER (PARTITION BY Uniform ORDER BY RowNum),RecursiveLevel + 1
  FROM RecursiveCte0
)
SELECT *
FROM RecursiveCte1
ORDER BY RecursiveLevel,RowNum;

结果:

RowNum Uniform RowVal MinVal SomeSum RowNumCalc RecursiveLevel
1      A       A      A      1       1          0
2      A       B      B      2       2          0
3      A       C      C      3       3          0
4      A       D      D      4       4          0
1      A       A      A      10      1          1
2      A       B      A      10      2          1
3      A       C      A      10      3          1
4      A       D      A      10      4          1

正如预期的那样,MINSUMROW_NUMBER 函数根据来自 RecursiveCte0 的所有行生成适当的值。我希望以下递归查询在逻辑上与上面的非递归版本相同,但会产生不同的结果:

WITH SourceData (RowNum,RecursiveCte (RowNum,0
  FROM SourceData
  UNION ALL
  SELECT
    RowNum,RecursiveLevel + 1
  FROM RecursiveCte
  WHERE RecursiveLevel < 1
)
SELECT *
FROM RecursiveCte
ORDER BY RecursiveLevel,RowNum;

结果:

RowNum Uniform RowVal MinVal SomeSum RowNumCalc RecursiveLevel
1      A       A      A      1       1          0
2      A       B      B      2       2          0
3      A       C      C      3       3          0
4      A       D      D      4       4          0
1      A       A      A      1       1          1
2      A       B      B      2       1          1
3      A       C      C      3       1          1
4      A       D      D      4       1          1

对于三个分析函数中的每一个,似乎只在每个单独行的上下文中应用分组,而不是在该级别的所有行。如果我对 (SELECT NULL) 进行分区,也会发生这种意外行为。我希望解析函数适用于整个递归级别,根据 MSDN:

CTE 递归部分中的分析和聚合函数是 应用于当前递归级别的集合而不是集合 对于 CTE。像 ROW_NUMBER 这样的函数只对 通过当前递归级别而不是整个递归级别传递给它们的数据 传递给 CTE 递归部分的数据集。

为什么这两个查询会产生不同的结果?有没有办法通过递归公用表表达式有效地使用解析函数?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...