CTE出乎意料的结果

Gid*_*dil 2 sql common-table-expression sql-server-2008

我创建了一个使用多个CTE的复杂过程(主要用于递归分层工作).
在小样本数据集上,一切都按预期进行,但是当我将代码应用于大型数据集时,我收到了意外(和错误)的结果.

我想我已经把它缩小到了CTE.递归CTE是在几个早期CTE中处理的"馈送"数据,这似乎是问题所在.

我设置了一个示例数据集如下:

  • 四行具有唯一数据
  • 每行接收一个随机行号(这是在CTE中添加的

然后,我获取第一个CTE的结果,并在第二个CTE中执行自连接.
我期望所有行都加入,每个行都是自己的.实际发生的是不相等的行加入.

有人可以提供这种行为的解释吗?

Ric*_*iwi 9

这个结果没有什么意外,除非您不理解.

每个CTE都被解析each and every time它被引用.是的,这就是为什么高事务性表上的简单CTE可能在一个引用中返回4行而在接下来的2个级别中返回5行.

然而,在你的样本上,这是因为ORDER BY NEWID(),给原始CTE的每个分辨率一个不同的row_number().您是否认为CTE存储在内存中并缓存?在SQLFiddle站点上,在您的结果下,有一个"查看执行计划"链接.它显示了表的2个不同的独立扫描.

  • 好答案.OP实现您想要的最佳方法是将TEST_CTE的结果存储在临时表中.一旦你添加了数据并存储了newid()命令的row_number,就可以根据需要多次引用它,现在你将以确定的方式连接这些行. (2认同)