2017-12-01 4 views
0

두 테이블 중 하나에는 개체 위치가있는 기하학 열과 기하학적 형식으로 된 다시 점 좌표가있는 테이블 (SQL Server)이 있습니다. 첫 번째 테이블에서 가장 가까운 개체를 찾으려면 두 번째 테이블의 각 지점이 필요합니다. 나는 하나의 지점이 작업을 수행 할 수있는 쿼리를 가지고 :SQL - 레코드 당 최적의 동작 수행

DECLARE @g geometry = geometry::STGeomFromText('POINT 
(1 2,)',0); 
SELECT TOP(1) geom.ToString() 
FROM [T1].[dbo].[table_shapes] 
WHERE geom.STDistance(@g) IS NOT NULL 
ORDER BY geom.STDistance(@g); 

지금이 나에게 특정 시점에 가장 가까운 테이블에서 레코드를 줄 것이다,하지만 나는 각 포인트가 가장 가까운 형태를 찾으려면 포인트를 하드 코딩하는 대신 포인트를 사용하는 내 테이블을 만들고 새 테이블에 결과 - 포인트 관련 모양을 넣고 싶습니다. 각 레코드를 반복하고 위의 쿼리를 수행하는 일종의 함수에 대해 생각하고 있지만이 방법이 느려질 수 있으므로 최선의 방법이 아닐 수도 있습니다 ... 제안 사항 JOIN을 사용하면 어떨까요?

답변

1
난 당신이 찾고있는 생각

= 기하학 :: STGeomFromText

DECLARE의 @g 형상 ('포인트 (1 2)', 0);

select * from mytable tt 
CROSS apply(
SELECT TOP(1) geom.ToString() 
FROM [T1].[dbo].[table_shapes] 
WHERE geom.STDistance(tt.g) IS NOT NULL 
ORDER BY geom.STDistance(tt.g) 
)ca 

왜 결과를 새 테이블에 저장 하시겠습니까?

0

그냥 생각해 보니, 현재 공간 DB 설정이 없습니다. 그래서 이것은 테스트되지 않았습니다.

SELECT s.geom.ToString(), g.geom.ToString() 
FROM table_shapes s , (SELECT TOP(1) geom 
         FROM other_table 
         WHERE geom geom.STDistance(s.geom) IS NOT NULL 
         ORDER BY geom.STDistance(s.geom)) g