1

ユーザーとモールの場所の間の距離(最も近い)を計算して注文しようとしています。モールの行ごとに実行する必要がありますが、パフォーマンスの問題があるため、「while」は使用したくありません。私は何をすべきか?

以下のコードは、実行後の最後の行のみを表示します。

@UserId INT
AS 
DECLARE
@UserLat DECIMAL(9,6),
@UserLon DECIMAL(9,6),
@MallLat DECIMAL(9,6),
@MallLon DECIMAL(9,6),
@geo1 geography,
@geo2 geography

SELECT TOP 1 @UserLat = l.Lat, @UserLon = l.Lon  FROM Location l WHERE l.UserId = @UserId ORDER BY l.LocationId DESC

SELECT @MallLat = m.MallLatitude, @MallLon = m.MallLongitude FROM Mall m

SET @geo1 = geography::Point(@UserLat, @UserLon, 4326)
SET @geo2 = geography::Point(@MallLat, @MallLon, 4326)

SELECT ROUND(@geo1.STDistance(@geo2)/1000,2)
4

1 に答える 1

1

SELECT計算をofに入れることができますMALL@geo1これにより、MALL各行からのソートされた距離が得られます。

...
SELECT TOP 1 @UserLat = l.Lat, @UserLon = l.Lon  
FROM Location l WHERE l.UserId = @UserId 
ORDER BY l.LocationId DESC

SET @geo1 = geography::Point(@UserLat, @UserLon, 4326)

SELECT ROUND(@geo1.STDistance(
    geography::Point(MallLatitude, MallLongitude, 4326))/1000,2) AS distance 
FROM Mall
ORDER BY distance

これを SQL Server 2012 でテストしたことに注意してください。お使いのバージョンの 2008 ではありません。

于 2013-07-25T21:37:41.190 に答える