2009-07-20 12 views
0

Je suis en train d'exécuter cette requête mais je reçois « ORA-00904: « Z1 de LONGITUDE ». » « : Identificateur non valide »Oracle SQL Identifiant non valide

Est-il possible de réécrire ce que j'ai donc accès à cette colonne dans la sous-requête existe? Ou y a-t-il généralement un meilleur moyen de réaliser ce que j'essaie de faire?

Merci

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 

Répondre

2

Votre problème est que vous ne pouvez pas descendre que de nombreux niveaux dans votre sous-requête. Je pourrais avoir manqué quelque chose effleurant votre requête mais pourrait:

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 

pas réécrite comme:

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 
+0

Je pensais que cela avait quelque chose à voir avec l'imbrication. Cela semble avoir résolu le problème. –

0

au lieu d'utiliser:

inner join zip_coords z1 using(zip) 

Essayez d'inclure zip_coords z1 dans le cadre de la clause FROM et inclure les jointures dans le WHERE. Vous devriez alors pouvoir accéder à z1 à partir de votre sous-requête.

1
 
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 

Je dois vous avertir, je ne sais pas comment cela affectera les performances de la requête.

+0

Cela n'a pas beaucoup affecté la performance. La performance était déjà assez terrible, et obtenir un résultat est beaucoup mieux que d'obtenir une erreur. –