SQL调用函数foreach在其他表中的每个记录上的行

时间:2017-06-08 15:17:24

标签: sql sql-server sql-server-2008 sql-server-2012

我有两张桌子;表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中很简单,但缺乏经验。

3 个答案:

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

如果您没有关于位置的索引,这将会很慢,但它会非常准确。而且你不必在每一行都运行额外的功能。你必须测试时间。