【发布时间】:2018-02-03 22:39:44
【问题描述】:
在这个 sqlfiddle...
http://sqlfiddle.com/#!6/b6587/6
我收到以下错误....
语句终止。最大递归100已用完 在语句完成之前。
我了解在 CTE 的第二个选择的 where 子句中需要进行“终止检查”。即使您取消注释 WHERE 子句,我也会收到相同的错误。
我只是想了解 1) 为什么需要它...毕竟每个订单行都与每个客户行都有关系,并且 2) 因为需要“终止检查”,所以会是什么样子这个例子可以工作。
顺便说一句,我想看到这个查询的输出如下。
1,'George', 'Patton','',''
1,'','','<some date>', 'tank'
1,'','','<some date>', 'plane'
2,'Lewie', 'Puller','',''
2,'','','<some date>', 'Rifle'
2,'','','<some date>', 'Hand Grenade'
顺便说一句,请随意评论获得这种结果的其他方法(不使用递归 cte),但也不要使用游标或临时表。我想通过基于集合的操作来做到这一点。
编辑
作为记录,我知道加入会起作用,但我有理由询问递归。为了给您提供背景信息,我正在处理一个 EXPORT 文件的结果集。每行只有一列,称为 LINE。此外,导出文件需要按我的示例的顺序输出...详细信息需要在标题行下,并且该模式需要重复...标题/详细信息...标题/详细信息。我认为也许递归可以解决这个问题。但是我知道简单的连接也可以解决它,只要我可以将行排列成正确的顺序...标题/详细信息...标题/详细信息,也许可以通过某种方式对列中的输出进行排序正确的方法。
我的导出将不依赖于调用应用程序来格式化数据...存储过程需要格式化数据。
【问题讨论】:
-
你为什么在这里使用递归? IT 将无休止地循环一遍又一遍地在订单表中查找相同的客户编号。似乎一个简单的连接会做任何你想做的事情,因为这些数据没有任何层次结构。查看this sqlfiddle 以使用“深度”跟踪递归步骤并将递归限制为 20。
-
它超过了最大递归次数,默认情况下为 100。这是由于您遇到的查询问题 - 正如@JNevill 所说,这是一个无限递归
-
有任何反馈吗?
-
@scsimon,感谢您的回答。我的问题缺乏背景。我已经编辑了答案以提供一些背景信息。我故意让我的 sqlfiddle 非常简单,以便可以解决递归问题。我真正的查询实际上确实有一些深度。
标签: sql sql-server sql-server-2008 recursion common-table-expression