Pergunta

Eu estou tentando executar essa consulta, mas eu recebo "ORA-00904: ""." Z1 LONGITUDE ": identificador inválido"

Existe uma maneira de reescrever isso para que eu tenha acesso a essa coluna na subconsulta existe? Ou há geralmente a melhor maneira de conseguir o que eu estou tentando fazer?

Graças

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
Foi útil?

Solução

Seu problema é que você não pode descer que muitos níveis em seu subconsulta. Eu poderia ter perdido algo de deslizando sobre sua consulta, mas poderia:

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

não ser reescrita como:

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

Outras dicas

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

Eu tenho que avisá-lo, eu não sei como isso vai afetar o desempenho da consulta.

em vez de usar:

inner join zip_coords z1 using(zip)

Tente incluindo zip_coords z1 como parte da cláusula FROM e incluem a junta no WHERE. Você deve então ser capaz de acesso z1 do seu subconsulta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top