【问题标题】:SQL Call function foreach row on every record in other table其他表中每条记录上的 SQL 调用函数 foreach
【发布时间】:2017-06-08 15:17:23
【问题描述】:

我有两张桌子; Table1(名称、纬度、经度)有 400 条记录,Table2(名称、纬度、经度)有 10,000 条记录。

我想查找 Table2 中物理上接近 Table1 中 400 条记录的所有记录。 (不包括表1中的所有400条记录)。

我有一个函数可以计算出两条记录之间的距离。我的问题是在 SQL 中,我不知道如何为 Table1 中的每条记录、Table2 中的每条记录运行它。我正在调用我的函数,如下所示;

dbo.fnCalcDistanceKM(item1.lat, item2.lat, item1.long, item2.long) < 0.150

这会获取两个坐标之间的距离,并且只会返回在 150 米内的坐标。它工作正常,但我正在努力为 Table1 中的每条记录运行它,而不是 Table2 中的每条记录。

任何指针都会非常感谢!我认为这在 SQL 中相当简单,但我的经验不足。

【问题讨论】:

  • fnCalcDistanceKM 函数有什么作用?
  • 这是什么类型的函数?标量函数?表值函数?

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


【解决方案1】:

我猜你正在寻找cross join 运算符:

SELECT 
    * 
FROM 
    Table1 T1 
    cross join Table2 T2 
WHERE 
    dbo.fnCalcDistanceKM(T1.lat, T2.lat, T1.long, T2.long) < 0.150

【讨论】:

  • @RachelAmbler 好点!由于我们有这个功能,我猜cross apply 在这种情况下会更好地工作,尤其是在大型记录集上......
【解决方案2】:

从两个表中选择:

SELECT
    *
FROM Table1 as item1,
Table2 as item2
WHERE dbo.fnCalcDistanceKM(item1.lat, item2.lat, item1.long, item2.long) < 0.150

【讨论】:

  • 是的。交叉产品。
【解决方案3】:

您可以更改表的数据类型吗?由于您使用的是 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

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

【讨论】:

  • SELECT 中的额外内容仅用于说明。如果您不需要它们,您可以删除它们并显着加快操作速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多