1

それぞれがポイント(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

さらに、上記のテーブルに格納されているこれらの各パターンの開始点を参照する別のテーブルがあります。

最終的な目標は、コンマ区切りのリストに統合された各パターンのすべてのポイントで 2 次元の結果を返すクエリを開発することです。この戻り値は次のようになります。

id | name | points
-----------------------
1  | test | 1,2,1,3,1,4

(ポイントの奇数インデックスは x で、偶数インデックスは y です。)

これを達成する単純な解決策は、親テーブルをループし、親テーブルの行セットごとに@idrCTE を実行することです。それはうまくいくでしょうし、私はすでにこれの大まかな実装をしていますが、私はこの解決策が好きではありません. この目標を達成するためのより良い、より「SQL」な方法はありますか?

4

1 に答える 1

0

以下は私が思いついた解決策です。「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
于 2014-11-05T23:45:05.247 に答える