如何实现这一点(在这种情况下查询数据库的最佳方式)

时间:2013-01-04 07:36:51

标签: sql sql-server stored-procedures cursor

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

包含用户位置信息的表

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

我想做以下事情:

在上面的表中查询特定用户,例如userid 1 我会得到他所有的位置

现在我想再次查询同一个表,对于上面返回的每一行,将地理点作为参数,以便我可以搜索特定距离内的任何其他用户。 我知道如何使用地理点并获取特定距离内的记录。但是我希望你能帮助我如何在第一个查询中循环记录并将所有resuts组合在一个输出中。

这是什么最好的apporach ..例如SQL查询,SP,游标或ASP.net边处理。我该如何实现这一目标?提前感谢您的所有帮助。

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

1 个答案:

答案 0 :(得分: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