2012-05-21 6 views
0

Ceci est une question assez délicate, mais je vais faire de mon mieux pour préciser:Récupérer des colonnes de la même table avec les mêmes clés étrangères mais des valeurs différentes

J'ai une table countrynames avec 3 colonnes: iso , lang, nom. La principale orthographe pour ces derniers est l'anglais, par exemple:

+-----+------+-----------------------------+ 
| iso | lang | name      | 
+-----+------+-----------------------------+ 
| CA | EN | Canada      | 
| CC | EN | Cocos (Keeling) Islands  | 
| CF | EN | Central African Republic | 
| CG | EN | Congo      | 
| CI | EN | Cote d'ivoire (Ivory Coast) | 
| CK | EN | Cook Islands    | 
| CL | EN | Chile      | 
| CM | EN | Cameroon     | 
| CN | EN | China      | 
| CO | EN | Colombia     | 
+-----+------+-----------------------------+ 

iso est la clé étrangère qui fait référence à l'ISO-3166 codant pour les pays. J'ai inséré un certain nombre de pays avec l'orthographe anglaise, mais aussi dans d'autres langues UNIQUEMENT lorsque l'orthographe est différente de l'anglais, afin d'économiser de l'espace dans la base de données (par exemple "Germany" en allemand est "Deutschland", donc l'iso pour 'DE' apparaît deux fois dans la table, avec 2 noms différents). Ce dont j'ai besoin est de sélectionner tous les pays dans une langue spécifique (comme l'allemand, ou l'espagnol), puis tous les pays avec des noms anglais de la même colonne. S'il n'y a pas de nom correspondant dans la langue étrangère, alors le nom anglais doit remplir le champ vide, de sorte que je reçois un mélange d'anglais + langue étrangère. Le mélange doit être égale à la somme des pays ayant une orthographe anglais, comme ceci (nulls sont où les noms anglais doivent remplir les noms espagnols disparus, comme le Congo, le Chili, la Chine, la Colombie):

'CA', 'ES', 'Canadá' 
'CC', 'ES', 'Islas Cocos' 
'CD', 'ES', 'República Democrática del Congo' 
'CF', 'ES', 'República Centroafricana' 
NULL, NULL, NULL 
'CH', 'ES', 'Suiza' 
'CI', 'ES', 'Costa del Marfil' 
'CK', 'ES', 'Islas Cook' 
NULL, NULL, NULL 
'CM', 'ES', 'Camerún' 
NULL, NULL, NULL 
NULL, NULL, NULL 
NULL, NULL, NULL 
NULL, NULL, NULL 

C'est ce que je jusqu'à présent:

select result2.iso, result2.lang, result2.name from (select result1.* from (select t1.* 
from (
select iso, lang, name from countrynames where lang = 'es') t1 
right join 
(select iso, lang, name from countrynames where lang = 'en') t2 
on t1.iso = t2.iso) result1) result2; 

Répondre

0

Votre origine SELECT peut être simplifié un peu:

SELECT t1.iso, t1.lang, t1.name 
    FROM (SELECT * FROM countrynames WHERE lang = 'ES') t1 
    RIGHT JOIN (SELECT * FROM countrynames WHERE lang = 'EN') t2 
    ON t1.iso = t2.iso; 

Ensuite, tout ce que vous devez faire est coalescer les résultats de la colonne, de sorte que vous Retrie ve les valeurs t2 s'il n'y a pas de valeurs dans t1:

SELECT COALESCE(t1.iso, t2.iso), COALESCE(t1.lang, t2.lang), COALESCE(t1.name, t2.name) 
    FROM (SELECT * FROM countrynames WHERE lang = 'ES') t1 
    RIGHT JOIN (SELECT * FROM countrynames WHERE lang = 'EN') t2 
    ON t1.iso = t2.iso; 
+0

merci beaucoup! Les solutions sont parfois si faciles à trouver, que nous perdons la trace des choses à la recherche de moyens compliqués pour atteindre l'objectif :) –

Questions connexes