基于集合的解决方案应该始终是您在使用 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