2

私は3つのテーブルt1、t2、およびt3を持っています。t1 には最初のポイントがあります

--------------------------
| t1
--------------------------
| objectId, x, y     <--(these are fields)
--------------------------
| 30536, 1364690.09169,16518759.7879
|
--------------------------

t2にはいくつかのポリラインがあり、これらはそれらの端点です

--------------------------
| t2
--------------------------
| objectId, from_x, from_y, to_x, to_y     <--(these are fields)
--------------------------
| 43664, 1364815.8770, 16518764.8200, 1364806.6780, 16518760.9000
| 43665, 1364806.6780, 16518760.9000, 1364710.2130, 16518719.7700
| 43666, 1364710.2130, 16518719.7700, 1364709.4300, 16518720.3000
| 43667, 1364709.4300, 16518720.3000, 1364690.0920, 16518759.7900
| 43370, 1364843.6870, 16518667.7600, 1364815.8770, 16518764.8200
|-------------------------

t3 には、行全体の最終的な終点があります

--------------------------
| t3
--------------------------
| objectId, x, y     <--(these are fields)
--------------------------
| 11191, 1364843.68657, 16518667.7589
|
--------------------------

端点がいずれかの点で一致するように、小数点以下 2 桁に切り捨てました。私がする必要があるのは、ある種の再帰クエリを作成して、最初から最後の終点までのすべての接続ポリラインまでの線を完成させることです。現在、いくつかのポリラインは常に -> から始まるとは限らず、逆に -> からというような組み合わせになる可能性があります。この例では

(30536 -> 43667 -> 43666 -> 43665 -> 43664 -> 43370 -> 11191) の行で最終目的地に到着します。したがって、必要なのは、結果の開始点 (30536) と終了点 (11191) だけです。

4

1 に答える 1

2

簡単なことではありませんが、例を作ることができました。

これは、あなたのような基本的なテーブル構造とソリューションを備えたSQLFiddleCTEです。基本的に、必要な再帰クエリを実現しますCTE。ただし、3 つの異なるテーブルがあるため、少し難しくなります。この代わりに、1 つのテーブルですべてのポイントを定義でき、始点と終点に存在しない値を追加できると、はるかに簡単になります。(NULLでも)。

テーブル構造:

CREATE TABLE startpoint(
  id int,
  x int,
  y int
)

CREATE TABLE points(
  id int,
  fx int,
  fy int,
  tx int,
  ty int
)


CREATE TABLE endpoint(
  id int,
  x int,
  y int
)

INSERT INTO startpoint VALUES(1, 1,1)
INSERT INTO startpoint VALUES(6, 2,4)
INSERT INTO points VALUES (2, 1,1 , 2,1)
INSERT INTO points VALUES (3, 2,1 , 2,2)
INSERT INTO points VALUES (4, 2,4 , 2,5)
INSERT INTO points VALUES (7, 2,5 , 3,2)
INSERT INTO points VALUES (8, 3,2 , 3,3)
INSERT INTO points VALUES (9, 3,3 , 3,4)
INSERT INTO endpoint VALUES(5, 2,2)
INSERT INTO endpoint VALUES(10, 3,4)

クエリ:

WITH CTE_Points
AS
(
   SELECT
  -1 AS FromID,
  s.ID AS ToID,
  -1 AS fx,
  -1 AS fy,
  s.x as tx,
  s.y as ty
  FROM startpoint s
  WHERE s.ID = 6

  UNION ALL

  SELECT 
  cte1.ToID AS FromID,
  points.ID AS ToID,
  points.fx,
  points.fy,
  points.tx,
  points.ty
  FROM points
  INNER JOIN  CTE_Points cte1 ON (points.fx = cte1.tx AND points.fy = cte1.ty)
  OR (points.tx = cte1.fx AND points.ty = cte1.fy)
  WHERE points.ID != cte1.ToID AND points.ID != cte1.FromID 

  UNION ALL

  SELECT
  e.ID AS FromID,
  -1 AS ToID,
  -1 AS fx,
  -1 AS fy,
  -1 AS tx,
  -1 AS ty
  FROM CTE_Points
  INNER JOIN endpoint e ON (CTE_Points.fx = e.x AND CTE_Points.fy = e.y)
  OR (CTE_Points.tx = e.x AND CTE_Points.ty = e.y)
  OR (points.fx = cte1.fx AND points.fy = cte1.fy)
  OR (points.tx = cte1.tx AND points.ty = cte1.ty)
  WHERE e.ID != CTE_Points.ToID AND e.ID != CTE_Points.FromID 

  )
SELECT FromID AS ID FROM CTE_Points
WHERE FromID != -1
UNION
SELECT ToID AS ID FROM CTE_Points
WHERE  ToID != -1

s.ID を 6 から 1 に変更してみてください。2 つの「方法」を別々に選択するにはどうすればよいですか。

(注:これは、次のようにテーブルに接続がない場合にのみ機能します: Record1.FromX = Record2.FromX AND Record1.FromY = Record2.FromY)

于 2012-09-12T14:36:00.290 に答える