【发布时间】:2015-09-04 20:05:16
【问题描述】:
好的,我正在研究将一组记录转换为分隔列表的问题。这是一个老问题,有几种方法,在很多情况下,我什至不应该在数据库中这样做。但是,在 this 的情况下,我想并且我想使用递归 CTE。
正如我的标题所暗示的那样,我对真正掌握这个概念的困难感到沮丧。过去,我用书籍或互联网帖子中的代码 sn-ps 解决了这个问题,并对其进行了改编并让它们工作。但这总是很难,而且我并没有真正掌握这项技术。我寻找了该技术的一个非常基本的实现,并得到了我用作模型的答案:https://stackoverflow.com/a/9726839/13748
所以现在,我有这个临时表#POSO,内容如下:
id inspectionLogKey PO SO
--- ---------------- ------------- ---------
1 7 374534-6988 SO37047
2 7 374534-5464 SO34110
3 7 374534-7135 SO37377
4 7 374534-5284 SO33863
5 7 374534-6710 SO36506
6 7 374534-5084 SO33565
根据这些数据,我想生成一个以逗号分隔的 PO 列值列表。我正在尝试用这个(以及一堆令人沮丧的排列)来做到这一点:
WITH POlists(id,POs) AS
(
SELECT p1.id, CONVERT(VARCHAR(MAX),p1.PO) as POs --anchor
FROM #POSO p1
WHERE p1.id = 1
UNION ALL
SELECT p2.id, POs + ',' + p2.PO --recursive
FROM #POSO p2
join POlists ON p2.id + 1 = POlists.id
)
SELECT * FROM POlists;
返回这个:
id POs
--- -----------
1 374534-6988
我知道你们中的一个人将能够在接下来的八分钟内指出代码错误。但我希望有人可以重新定义它正在做什么,这样我就可以真正理解它并将它从这次遭遇中带走,作为未来使用的工具。
也许一旦发生这种情况,我就可以自己回答这个问题了,但是这个查询能否同时处理 PO 和 SO 列,产生两个字段,每个字段都是逗号分隔的列表两个各自的列?
感谢您的宝贵时间!
【问题讨论】:
-
您说您正在尝试创建以逗号分隔的值列表。与使用递归 cte 相比,您可以更容易地做到这一点。您可以使用 FOR XML 来更轻松、更快速地完成此操作。 sqlservercentral.com/articles/comma+separated+list/71700
-
@SeanLange - OP 似乎知道不同的方法,但声明“在这种情况下,我想要,并且我想要使用递归 CTE。”
-
但是递归 cte 是一种效率低下的工具。仅仅因为它可以这样做并不意味着它应该这样做。
-
没错,我过去也为此使用过 FOR XML PATH。 @SeanLange 当您说“更快”时,您是指更快地编写代码还是更快地执行代码?
-
写起来肯定更快,根据我的经验,执行起来也更快。当然要看深度。 :)
标签: sql-server recursion sql-server-2008-r2 common-table-expression