0

我正在使用 MS SQL DB 开发一个 asp.net 应用程序。我有以下情况

包含用户位置信息的表格

用户 ID、地理位置、位置类型

我想做以下事情:

在表格上方查询特定用户,例如 userid 1 我将获取他的所有位置

现在我想再次以地理点为参数为上面返回的每一行查询同一个表,以便我可以搜索特定距离内的任何其他用户。我知道如何使用地理点并获取特定距离内的记录。但是,我需要您帮助我如何遍历第一个查询中的记录并将所有结果合并到一个输出中。

对此最好的方法是什么.. 例如 SQL 查询、SP、游标或来自 ASP.net 端处理。我怎样才能做到这一点?提前感谢您的所有帮助。

*我将查询每个位置类型的表,例如,如果位置类型 = A,那么距离应该是 10 公里,如果 B 是 50 公里等

4

1 回答 1

0

基于集合的解决方案应该始终是您在使用 SQL 时尝试找到的第一件事。我们不做循环(*)

SELECT
    * --TODO - Select columns
FROM
    UserLocations ul1
        inner join
    UserLocations ul2
        on
            ul1.User != ul2.User and
            ul1.Point.StDistance(ul2.Point) < 10 --Whatever you distance criteria is
WHERE
    ul1.User = 1

(*) 除非我们已经尝试并未能找到性能足够好的基于集合的解决方案。


如果您想为每种位置类型提供一个结果集,则类似于:

SELECT
    * --TODO - Select columns
FROM
    UserLocations ul1
        inner join
    UserLocations ul2
        on
            ul1.User != ul2.User and
            ul1.Point.StDistance(ul2.Point) <
                CASE WHEN ul1.LocationType='A' THEN 10
                     WHEN ul1.LocationType='B' THEN 50
                END
WHERE
    ul1.User = @UserID --User parameter
ORDER BY
    ul1.LocationType --Guessing you might want each location types rows together

如果您想分别执行每个位置(不知道为什么要这样做,但无论如何):

SELECT
    * --TODO - Select columns
FROM
    UserLocations ul1
        inner join
    UserLocations ul2
        on
            ul1.User != ul2.User and
            ul1.Point.StDistance(ul2.Point) <
                CASE WHEN ul1.LocationType='A' THEN 10
                     WHEN ul1.LocationType='B' THEN 50
                END
WHERE
    ul1.User = @UserID --User parameter
    AND ul1.LocationType = @Location --Location parameter
于 2013-01-04T07:41:40.987 回答