我正在使用MS SQL DB开发一个asp.net应用程序。我有以下secnario
包含用户位置信息的表
用户ID,地理位置,位置类型
我想做以下事情:
在上面的表中查询特定用户,例如userid 1 我会得到他所有的位置
现在我想再次查询同一个表,对于上面返回的每一行,将地理点作为参数,以便我可以搜索特定距离内的任何其他用户。 我知道如何使用地理点并获取特定距离内的记录。但是我希望你能帮助我如何在第一个查询中循环记录并将所有resuts组合在一个输出中。
这是什么最好的apporach ..例如SQL查询,SP,游标或ASP.net边处理。我该如何实现这一目标?提前感谢您的所有帮助。
*我将查询每个位置类型的表格,例如,如果位置类型= A,那么距离应为10公里,如果B为50 KM等
答案 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