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
...