2012-09-12 3 views
2

세 개의 테이블 t1, t2 및 t3이 있습니다. T1은Sql Server 2008 Express 재귀 쿼리

-------------------------- 
| 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 
| 
-------------------------- 

내가 한 내 전체 라인의 내 마지막 종점이있다 끝점이 한 지점 또는 다른 지점에서 일치하도록 두 자릿수로 반올림합니다. 내가해야 할 일은 반복 시작 쿼리의 일부 유형을 만들어서 모든 폴리 라인을 마지막 종점에 연결하는 선을 완료하는 것입니다. 이제는 어떤 폴리선이 항상 시작되지는 않습니다.> 다른 종류의 조합 일 수도 있습니다. 이 예에서는

라인 (30536 -> 43667 -> 43666 -> 43665 -> 43664 -> 43370 -> 11191)으로 최종 목적지에 도달합니다. 그래서 제가 필요한 것은 시작점 (30536)과 끝점 (11191)입니다.

+0

내가했던 복수 (최대 3) 자체 조인 t2 – Fonzy

+0

CTE –

+0

에 도움을 주려고했습니다. 유감스럽게도 일부 폴리 라인이 있습니다 -> – Fonzy

답변

2

쉬운 것은 아니지만 예제를 만들 수 있습니다.

CTE 솔루션과 같은 기본적인 테이블 구조를 가진 SQLFiddle입니다. 기본적으로 재귀 쿼리를 수행하려면 CTE이 필요합니다. 그러나 당신이 3 개의 다른 테이블을 가지고 있기 때문에 조금 더 어렵습니다. 이 대신 하나의 테이블에 모든 포인트를 정의 할 수 있고 시작점과 종점에 대해 기존 값이 아닌 값을 추가 할 수 있다면 훨씬 더 쉽습니다. (심지어 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 

당신이 어떻게 두 개의 "방법"을 선택하고, 6에서 1로 s.ID을 변경 시도 할 수 있습니다 분리.

(참고 :이처럼 테이블에 연결이없는 경우에만 작동 : Record1.FromX = Record2.FromX 및 Record1.FromY = Record2.FromY)