我有两张桌子;表1(名称,纬度,经度),其中包含400条记录和表2(名称,纬度,经度),其中有10,000条记录。
我想在Table2中找到物理上接近Table1中400条记录的所有记录。 (不包括表1中的所有400条记录)。
我有一个功能可以解决两个记录之间的距离。我的问题是在SQL中我无法弄清楚如何为表1中的每条记录运行它,在Table2中的每条记录上。我打电话给我的功能如下;
dbo.fnCalcDistanceKM(item1.lat, item2.lat, item1.long, item2.long) < 0.150
这将获得两个坐标之间的距离,并且只有在150米范围内才能返回。它工作正常,但我正在努力为表1中的每条记录运行Table1中的每条记录。
任何指针都会非常受欢迎!我认为这在SQL中很简单,但缺乏经验。
答案 0 :(得分:3)
我猜您正在寻找cross join运营商:
SELECT
*
FROM
Table1 T1
cross join Table2 T2
WHERE
dbo.fnCalcDistanceKM(T1.lat, T2.lat, T1.long, T2.long) < 0.150
答案 1 :(得分:2)
从两个表中选择:
SELECT
*
FROM Table1 as item1,
Table2 as item2
WHERE dbo.fnCalcDistanceKM(item1.lat, item2.lat, item1.long, item2.long) < 0.150
答案 2 :(得分:1)
您是否可以更改表格的数据类型?由于您使用的是SQL 2008+,因此您可以使用GEOGRAPHY数据类型并将lat / lon存储在一列中,然后使用CROSS JOIN轻松地对两者进行比较。
https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/spatial-types-geography
SELECT t2.name, t2.loc, t2.loc.STDistance(t1.loc) AS distance
FROM Table2 t2
CROSS JOIN Table1 t1
WHERE t2.loc.STDistance(t1.loc) < 150
或者使用您当前的数据集,可能:
SELECT t2.name, t2.latitude, t2.longitude
, POINT(t2.latitude & ' ' & t2.longitude) AS thePoint
, (POINT(t2.latitude & ' ' & t2.longitude)).STDistance(POINT(t1.latitude & ' ' & t1.longitude)) AS distance
FROM Table2 t2
CROSS JOIN Table1 t1
WHERE (POINT(t2.latitude & ' ' & t2.longitude)).STDistance(POINT(t1.latitude & ' ' & t1.longitude)) < 150
如果您没有关于位置的索引,这将会很慢,但它会非常准确。而且你不必在每一行都运行额外的功能。你必须测试时间。