SQL - 按记录最佳方式执行操作

时间:2017-12-01 08:04:28

标签: sql sql-server geolocation spatial-query

我有2个表,其中一个表包含具有对象位置的几何列,另一个表以几何格式(SQL Server)再次只有点坐标。我需要第二个表的每个点找到第一个最近的对象。我得到了一个查询,可以做到这一点:

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实现这一点吗?

2 个答案:

答案 0 :(得分:1)

我认为你正在寻找这个,

DECLARE @g geometry = geometry :: STGeomFromText('POINT (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

为什么要将结果存储在新表中?

答案 1 :(得分:0)

只是一个想法,我目前没有任何空间数据库设置。所以这没有经过测试。

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