2012-02-23 23 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 2012-02-23 20:24:57

+0

通常,包含您正在使用的特定RDBMS是一个好主意。这个SQL Server,如果是的话,是什么版本? – Dan 2012-02-23 20:25:16

+0

@DanNewhouse我认为只有SQL Server具有“geography”数据类型,从2K8开始。 – Yuck 2012-02-23 20:34:47

回答

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 2012-02-23 20:55:54

+0

编辑我的答案只显示网站表格的列 – 2012-02-23 20:59:03

+0

非常感谢。 – toy4fun 2012-02-23 21:00:54

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 2012-02-23 21:08:39