Sql server 2012 在多行上执行rCTE是否有基于集合的解决方案?
我有一个表,它存储了许多行,每行声明一个点x,y。每一行引用模式中的下一点,因此检索整个模式的查询是通过链表结构递归定义的。我已经开发了一个rCTE来检索一个完整的结构,看起来像这样Sql server 2012 在多行上执行rCTE是否有基于集合的解决方案?,sql-server-2012,sql-server-2014,recursive-cte,Sql Server 2012,Sql Server 2014,Recursive Cte,我有一个表,它存储了许多行,每行声明一个点x,y。每一行引用模式中的下一点,因此检索整个模式的查询是通过链表结构递归定义的。我已经开发了一个rCTE来检索一个完整的结构,看起来像这样 WITH list (id, next, x, y) AS ( -- rCTE anchor expression SELECT id, next, x, y FROM POINT WHERE id = @id UNION ALL -- rCTE recursive expres
WITH list (id, next, x, y) AS (
-- rCTE anchor expression
SELECT id, next, x, y
FROM POINT
WHERE id = @id
UNION ALL
-- rCTE recursive expression
SELECT POINT.id, POINT.next, POINT.x, POINT.y
FROM POINT
INNER JOIN list ON POINT.id = list.next)
SELECT x, y FROM list
此外,我还有另一个表,它引用了存储在上述表中的每个模式的起点
最终目标是开发一个查询,该查询将返回一个二维结果,每个模式的所有点合并到一个逗号分隔的列表中。此返回值如下所示:
id | name | points
-----------------------
1 | test | 1,2,1,3,1,4
点中的奇数指数为x,偶数指数为y
现在实现这一点的简单解决方案是循环父表,并为每个父表行设置@id并运行rCTE。这会起作用,我已经大致实现了这一点,但我不喜欢这个解决方案。是否有更好、更具SQL的方法来实现这一目标?下面是我提出的解决方案,其中AREA是引用给定区域起点的父表
WITH list (id, next, latitude, longitude, path) AS (
-- rCTE anchor expression
SELECT POINT.id, next, latitude, longitude, path = 1
FROM AREA INNER JOIN POINT ON AREA."start" = POINT.ID
UNION ALL
-- rCTE recursive expression
SELECT POINT.id, POINT.next, POINT.latitude, POINT.longitude, list.path + 1
FROM POINT INNER JOIN list ON POINT.id = list.next)
SELECT a.name, points = STUFF(
(SELECT ',' + CAST(latitude AS VARCHAR) + ',' + CAST(longitude AS VARCHAR)
FROM list b
WHERE a.name = b.name
ORDER BY b.path ASC
FOR XML PATH('')),
1, 1, '')
FROM list a