1

我有一个可以正常工作的现有搜索。它正在搜索表 1(俱乐部),但需要从表 2(城镇)中获取一些数据。为此,它执行两个表的 INNER JOIN。

我现在正试图将结果限制在距某个点一定距离内的范围内。

这两个表都有名为纬度和经度的字段,但只填充了城镇值,因此我需要在搜索中使用这些值。

其他几个字段在两个表中使用相同的名称,所以我必须指出我的意思是哪个表(例如 Towns.town_key)。

为了进行距离搜索,我在内部嵌套中进行了粗略的方形框搜索,然后在外部嵌套中对结果进行了毕达哥拉斯公式。(我不需要 Haversine 的准确性。)

无论我尝试什么,我都会在前面有表名的字段上遇到错误。不幸的是,尽管阅读了很多书,但我并不完全理解别名等的使用。

这是我的搜索:

SELECT club_key, name, Towns.town_key, town_name, Clubs.address,
sqrt(((-32.380100 - Towns.latitude)*111.133)^2 + ((147.481400 - 
Towns.longitude)*93.853)^2) AS dist FROM 

(SELECT club_key, name, Towns.town_key, town_name, Clubs.address FROM Clubs 

INNER JOIN Towns ON Clubs.town_key = Towns.town_key WHERE type = 'football' 
AND Towns.latitude BETWEEN -32.829761 AND -31.930439 AND Towns.longitude BETWEEN 146.948951 AND 148.013849) AS T1 

WHERE dist < 50 ORDER BY 6,2

最新的错误是:无法运行查询:“字段列表”中的未知列“Towns.town_key”

在此之前,它反对在内部和外部选择中使用的纬度和经度字段。

4

2 回答 2

2

这里的问题是您的别名范围。试一试:

SELECT T1.club_key, T1.name, T1.town_key, T1.town_name, T1.address,T1.dist
FROM 
(
SELECT
sqrt(((-32.380100 - Towns.latitude)*111.133)^2 + ((147.481400 - 
Towns.longitude)*93.853)^2) AS dist, 
club_key, name, Towns.town_key, town_name, Clubs.address 
FROM Clubs 
INNER JOIN Towns ON Clubs.town_key = Towns.town_key 
WHERE type = 'football' 
AND Towns.latitude BETWEEN -32.829761 AND -31.930439 
AND Towns.longitude BETWEEN 146.948951 AND 148.013849
) AS T1 
WHERE T1.dist < 50 ORDER BY 6,2

您正在尝试使用嵌套选择之外的别名,即Towns引用嵌套选择中的表,即Towns表。您可以使用您的T1别名来解决这个问题。

于 2013-10-24T10:08:47.217 回答
0
SELECT  
    T1.club_key, 
    T1.name, 
    T1.town_key, 
    T1.town_name, 
    T1.address,
    sqrt(((-32.380100 - T1.latitude)*111.133)^2 + ((147.481400 - T1.longitude)*93.853)^2) AS dist 
FROM 
(
    SELECT 
        Towns.latitude,
        Towns.longitude,
        club_key, 
        name, 
        Towns.town_key, 
        town_name, 
        Clubs.address 
    FROM Clubs 
    INNER JOIN Towns ON Clubs.town_key = Towns.town_key 
    WHERE 
        type = 'football' 
        AND Towns.latitude BETWEEN -32.829761 AND -31.930439 
        AND Towns.longitude BETWEEN 146.948951 AND 148.013849
) AS T1 
HAVING dist < 50 
ORDER BY 6,2

在上一个答案中,我认为 WHERE 将不起作用,而不是您必须使用 HAVING

于 2013-10-24T10:51:13.797 回答