2017-09-20 1 views
1

J'ai une table qui contient le nom de ville en anglais et en français seulement si le nom est différent sinon il aura seulement le nom anglais. REMARQUE. Le géocodage sera le même pour la ville CityA et CityA` puisque les deux sont la même ville mais le code sera différent.UNION et NOT EXISTS throws Erreur

Table name = Ville

Les colonnes sont ci-dessous

city,code,language,geocode 

Par exemple.

cityA Frc 
cityA Frc 
cityB Eng 
CityC Eng 
CityD Eng 
CityD` FRC 

Ainsi, nous pouvons voir ci-dessus par exemple que CITYA a à la fois FRANÇAIS et le nom anglais alors que CityB ne pas parce que CityB a la même orthographe/accent en français et en anglais. Ce que je veux faire est basé sur la langue de l'utilisateur, si la langue de l'utilisateur est le français, puis retourner tous les noms français et anglais qui n'ont pas d'accent français. donc de ci-dessus il devrait retourner CityA`, CityB, CityC, CityD '

De même si la langue de l'utilisateur est l'anglais, retournez tous les noms anglais. VilleA, CityB, VilleC.CityD.

Voici ce que j'ai essayé

select a.city,a.code from country a 
where a.language=userenv('lang') -- it will be either french or english 
union 
select b.city,b.code from country b 
where b.language='Eng' 
AND not exists(select geocode from country 
      where geocode = a.geocode) 

Je reçois erreur a.geocode pas identifié.

Répondre

2

Les alias de table doivent être corrects.

Je recommande:

select c.city, c.code 
from country c 
where c.language = userenv('lang') -- it will be either french or english 
union all 
select c2.city, c2.code 
from country c2 
where c2.language = 'Eng' and 
     not exists (select 1 
        from country c3 
        where c3.geocode = c2.geocode 
       ); 

Dans votre requête, l'alias a n'est pas connu dans la sous-requête. Toutefois, les alias de table doivent être des abréviations pour le nom de la table, plutôt que des lettres arbitraires.

Cela dit, je pense que la question que vous voulez vraiment est:

select c.city, c.code 
from country c 
where c.language = userenv('lang') -- it will be either french or english 
union all 
select c2.city, c2.code 
from country c2 
where c2.language = 'Eng' and 
     not exists (select 1 
        from country c3 
        where c3.geocode = c2.geocode and 
         c3.language = userenv('lang') 
       ); 
+0

Votre première requête ne peut pas fonctionner car les NOT EXISTS excluent toutes les lignes. C'est la même table donc il y a toujours une ligne avec ce Géocode, la ligne _current_. –

1

faire une auto full outer join, une instance de table pour userenv ('lang') et une pour l'anglais:

select coalesce(c1.city, c2.city), coalesce(c1.code, c2.code) 
from country c1 
full outer join country c2 
    on c1.code = c2.code 
    and c1.language = userenv('lang') 
    and c2.language = 'Eng' 

Utilisez COALESCE() pour sélectionner les valeurs userenv ('lang') si elles sont disponibles, sinon les valeurs anglaises.