0

我正在尝试运行此查询,但我得到“ORA-00904:“Z1”。“LONGITUDE”:无效标识符”

有没有办法重写它,以便我可以访问存在子查询中的该列?或者通常有更好的方法来实现我想要做的事情?

谢谢

select zip, count(UNIQUE address_id) LOCATIONS
from records 
inner join addresses a using(address_id) 
inner join zip_coords z1 using(zip)
where exists
(
  select 1 from (
    select distance(z1.latitude, z1.longitude, z2.latitude, z2.longitude) d
    from zip_coords z2
    where z2.zip in (
      select zip from available_zips
    )
  ) where d <= 50
)
GROUP BY ZIP
4

3 回答 3

2

您的问题是您不能在子查询中下降那么多级别。我可能在浏览您的查询时遗漏了一些东西,但可以:

select 1 from (
    select distance(z1.latitude, z1.longitude, z2.latitude, z2.longitude) d
    from zip_coords z2
    where z2.zip in (
      select zip from available_zips
    )
  ) where d <= 50

不改写为:

SELECT 1
FROM zip_coords z2
WHERE z2.zip IN (
  SELECT zip FROM available_zips
)  
AND distance(z1.latitude, z1.longitude, z2.latitude, z2.longitude) <= 50
于 2009-07-20T16:24:28.730 回答
1
选择 zip,计数(唯一地址 ID)位置
从记录
内部连接地址 a using(address_id)
使用(zip)内部连接 ​​zip_coords z1
在哪里
(
    选择 min(距离(z1.latitude, z1.longitude, z2.latitude, z2.longitude)) d
    来自 zip_coords z2
    内部连接 ​​available_zips 使用(zip)
) <= 50
按邮编分组

我必须警告你,我不知道这将如何影响查询的性能。

于 2009-07-20T16:28:05.820 回答
0

而不是使用:

inner join zip_coords z1 using(zip)

尝试将 zip_coords z1 包含在 FROM 子句中,并将连接包含在 WHERE 中。然后,您应该能够从子查询中访问 z1。

于 2009-07-20T16:27:37.677 回答