2012-02-23 6 views
1

私は、このSQLスクリプトを書いた:SQLスクリプトをリファクタリング

DECLARE @location geography 
    DECLARE @radius int 

    SET @location = (SELECT Location FROM Hydrants WHERE HydrantId = 2) 
    SET @radius = (SELECT Radius FROM Hydrants WHERE HydrantId = 2) 

    SELECT * 
    FROM Sites 
    WHERE @location.STDistance(location) < @radius 
    ORDER BY SiteId ASC 

私は

SELECT * 
FROM Sites, Hydrants 
Inner Join Hydrants.Location.STDistance(Sites.Location) < Hydrants.Radius 
WHERE Hydrants.HydrantId = 2 
ORDER BY Sites.SiteId ASC; 

しかし運なしでそれをリファクタリングするこれをしました。

アドバイスをお待ちしております。

+2

問題は何ですか?私の心の読書装置は今日フリッツにあります。 – JohnFx

+0

通常は、使用している特定のRDBMSを含めることをお勧めします。このSQL Serverは、もしあれば、どのバージョンですか? – Dan

+0

@DanNewhouse SQL Serverには2K​​8から始まる 'geography'データ型しかないと思います。 – Yuck

答えて

2

いけないSQL 2008の地理的特徴を知っているが、あなたのコードを見ると、次はうまくいくかもしれない:

SELECT 
    Sites.* 
FROM Sites 
INNER JOIN Hydrants 
    ON Hydrants.Location.STDistance(Sites.location) < Hydrants.Radius 
WHERE Hydrants.HydrantId = 2 
ORDER BY Sites.SiteId ASC; 
+0

ありがとうが、これは私に同じラインのサイトと消火器の両方を与える。私は、消火器から与えられた半径のサイトだけが必要です。 – toy4fun

+0

サイトテーブルの列を表示するだけの私の答えを編集 –

+0

ありがとうございました。 – toy4fun

0

私は地理タイプで作業したことはありませんが、これは元のクエリと同じジョインの正しい構文です。

SELECT Sites.* 
FROM Sites 
JOIN Hydrants 
    ON Hydrants.Location.STDistance(Sites.Location) < Hydrants.Radius 
WHERE Hydrants.HydrantId = 2 
ORDER BY Sites.SiteId ASC; 
+0

ありがとうございました。 – toy4fun