SELECT JOIN Frage

Hallo,
ich habe 2 tabellen:

Tabelle countryinfo gibt eine id und den Namen in englisch:

geonameid;name

831053;“Kosovo”
3042058;“Liechtenstein”
597427;“Lithuania”
2960313;“Luxembourg”
458258;“Latvia”

Tabelle alternatename gibt den alternativen Namen (alternatename) und einen boolschen Wert wenn dieser Name in einer Sprache bezorzugt werden soll… beispielsweise Deutsch:

geonamid;isolanguage;alternatename;ispreferred

831053;“de”;“Kosovo”;TRUE
3042058;“de”;“Liechtenstein”;TRUE
597427;de;“Litauen”;TRUE
2960313;“de”;“Luxembourg”;FALSE
458258;de;“Lettland”;TRUE

Als Ergebniss der Abfrage möchte ich das wo es möglich ist den deutschen Namen und wenn nicht dann den englischen ausgegeben haben, also so:

genameid;name

831053;“Kosovo”
3042058;“Liechtenstein”
597427;“Litauen”
2960313;“Luxembourg”
458258;“Lettland”

also, das wenn isolanguage und preferredname aus Tabelle alternatename nicht matchen, der Datensatz aus Tabelle countryinfo ausgegeben wird.

Wie muss ich das SELECT verbinden?

ich denke, Du suchst coalesce()

Ja, ist mir auch schon durch den Kopf gegangen, ich finde nur keinen Ansatz wie ich das verbinde

coalesce(table1.feld1, table2.feld2)



SELECT
 COALESCE(cit.geonameid, an.geonameid) AS geonameid,
 COALESCE(cit.name, an.alternatename) AS name
FROM
 countryinfoturism cit, alternatename an
LEFT JOIN
	alternatename an1 ON(
		cit.geonameid = an1.geonameid
		AND an1.isolanguage = 'de'
		AND an1.ispreferredname = TRUE
	)
WHERE
cit."idTurismContinent" = 6255148;

gibt

FEHLER: ungültiger Verweis auf FROM-Klausel-Eintrag für Tabelle „cit“
SQL Status:42P01
Hinweis:Es gibt einen Eintrag für Tabelle „cit“, aber auf ihn kann aus diesem Teil der Anfrage nicht verwiesen werden.
Zeichen:410

Zuerst einmal: das hier:

FROM
 countryinfoturism cit, alternatename an
LEFT JOIN ...

ist ganz schlecht. Du solltest niemals implizite joins über die WHERE Klausel mit expliziten JOINs mischen. Entweder alles im FROM + WHERE join, oder alles mit expliziten JOINs.

Zum eigentlichen Problem: ich bin mir nicht ganz sicher, ob ich Dir richtig verstanden habe, aber ich denke, Du suchst das hier:

SELECT cit.geonameid AS geonameid,
       case 
         when an.ispreferred then an.alternatename 
         else cit.name
       end as name
FROM countryinfo cit
   JOIN alternatename an ON cit.geonameid = an.geonamid

Wenn es nicht zu jeden countryinfo auch ein alternatename gibt, dann brauchst Du wirklich einen LEFT JOIN, statt dem JOIN.

Ok, Danke erstmal, mit einigen Ergänzungen geht es langsam vorran:

SELECT 
cit.geonameid AS geonameid,
CASE 
	WHEN 
	an.ispreferredname = TRUE
        AND
        an.isolanguage = 'de'
	THEN 
	an.alternatename 
        ELSE 
        cit.name
END AS name,
an.isolanguage AS language,
an.ispreferredname AS boolispreferred
FROM 
countryinfoturism cit
JOIN
alternatename an ON
	an.geonameid = cit.geonameid
WHERE
cit."idTurismContinent" = 6255148 //---> ID für Europa
ORDER BY
geonameid, name;

ABER, warum wird WHEN ignoriert?

Vorläufiges Ergebnis:

geonameid;name;isolangauge;boolispreferred
...
617790;"Maldoba";"ha";t
617790;"Mɔldova";"ak";t
617790;"Moldau (Republik Moldau)";"de";t
617790;"Moldavia";"ia";t
...
617790;"Moldova";"nl";f
617790;"Moldova";"nb";f
617790;"Moldova";"mt";f
...

Hab noch einen besseren Lösungsansatz gefunden:

SELECT 
COALESCE(cit.geonameid, an.geonameid) AS geonamid,
COALESCE(cit.name, an.alternatename) AS name,
an.isolanguage AS language,
an.ispreferredname AS boolpreferredname
FROM 
countryinfoturism cit
LEFT JOIN
alternatename an ON
   an.geonameid = cit.geonameid
   AND
   an.ispreferredname = TRUE
   AND
   an.isolanguage = 'de'
WHERE
cit."idTurismContinent" = 6255148; // --> für Europa

gibt

geonameid;name;language;boolpreferredname
0;"Serbia and Montenegro";"";
390903;"Greece";"";
453733;"Estonia";"";
458258;"Latvia";"";
597427;"Lithuania";"";
607072;"Svalbard and Jan Mayen";"de";t
614540;"Georgia";"";
617790;"Moldova";"de";t
630336;"Belarus";"de";t
660013;"Finland";"";
661882;"Aland Islands";"de";t
690791;"Ukraine";"";
718075;"Macedonia";"de";t
719819;"Hungary";"";
732800;"Bulgaria";"";
783754;"Albania";"";
798544;"Poland";"";
798549;"Romania";"";
831053;"Kosovo";"";
2017370;"Russia";"de";t
2264397;"Portugal";"";
2510769;"Spain";"de";t
2562770;"Malta";"de";t
2622320;"Faroe Islands";"de";t
2623032;"Denmark";"";
2629691;"Iceland";"";
2635167;"United Kingdom";"de";t
2658434;"Switzerland";"de";t
2661886;"Sweden";"";
2750405;"Netherlands";"";
2782113;"Austria";"de";t
2802361;"Belgium";"";
2921044;"Germany";"de";t
2960313;"Luxembourg";"";
2963597;"Ireland";"";
2993457;"Monaco";"";
3017382;"France";"";
3041565;"Andorra";"";
3042058;"Liechtenstein";"";
3042142;"Jersey";"de";t
3042225;"Isle of Man";"de";t
3042362;"Guernsey";"de";t
3057568;"Slovakia";"de";t
3077311;"Czech Republic";"";
3144096;"Norway";"";
3164670;"Vatican";"de";t
3168068;"San Marino";"";
3175395;"Italy";"de";t
3190538;"Slovenia";"";
3194884;"Montenegro";"";
3202326;"Croatia";"";
3277605;"Bosnia and Herzegovina";"";
6290252;"Serbia";"";

Jetzt brauch ich nur noch die deutschen Namen, wo

...;language;boolpreferredname
...
...;"de";t
...