【问题标题】:Is there a set-based solution for executing an rCTE over multiple rows?是否有基于集合的解决方案用于在多行上执行 rCTE?
【发布时间】:2014-07-15 23:26:50
【问题描述】:

我有一个表,其中存储了许多行,每行声明一个点 (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 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”的方式来实现这个目标?

【问题讨论】:

    标签: sql-server-2012 sql-server-2014 recursive-cte


    【解决方案1】:

    下面是我想出的解决方案,其中“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多