Left Join funktioniert nicht
Manu
- datenbank
Hallo zusammen,
ich habe eine größere Query, die recht viele Daten aus der DB holt, unter anderem Adressen. Nun kann es allerdings sein, dass eine Adresse fehlt - damit mir nicht der ganze Datensatz fehlt, versuche ich 2 left joins. Seltsamerweise will der erste nicht funktionieren - ich bekomme die Meldung "column "adressen_id" does not exist".
Hat jemand eine Idee?
Die Query:
SELECT DISTINCT
p.id,
p.name1,
p.partnertyp,
a.id AS aid,
a.adressen_id,
padr.strasse AS pstrasse,
padr.hausnummer AS phnr,
padr.plz AS pplz,
padr.ort AS port,
aadr.strasse AS astrasse,
aadr.hausnummer AS ahnr,
aadr.plz AS aplz,
aadr.ort AS aort
FROM getpartner(4) p,
getVertragskonten(4) vk,
getVertraege(4) v,
getAnlagen(4) a
LEFT JOIN getAdressen(4) aadr ON (adressen_id = aadr.id)
LEFT JOIN getAdressen(4) padr ON (id = padr.geschaeftspartner_id)
WHERE p.id IN (1064279)
AND vk.geschaeftspartner_id = p.id
AND v.vertragskonten_id = vk.id
AND a.vertraege_id = v.id
(hoffentlich ohne c&p-Fehler...:))
Gruß,
Manu
Hello,
FROM getpartner(4) p,
getVertragskonten(4) vk,
getVertraege(4) v,
getAnlagen(4) aLEFT JOIN getAdressen(4) aadr ON (adressen_id = aadr.id)
LEFT JOIN getAdressen(4) padr ON (id = padr.geschaeftspartner_id)
OK, mir stellen sich gerade die Nackenhaare hoch...
MfG
Rouven
Hi!
OK, mir stellen sich gerade die Nackenhaare hoch...
Hui, sehen will! ;D
- warum mischst du implizite und explizite JOIN Syntax - ich finde es ja schonmal nett vom DBMS, dass das keinen Syntaxfehler gibt. Nur in Punkto Vorhersagbarkeit der Ergebnisse finde ich es - gelinde gesagt - unglücklich
Unglücklich ja, aber wie sonst kann ich ohne größeren Aufwand an meine Anlagen kommen...?
- was ist getVertragskonden(4) etc., sind das Tabellennamen??
Nee, SP's - damit bekomme ich über eine Version (hier 4) alle zugehörigen Daten
- adressen_id kann offenbar keiner/nicht eindeutig einer der beteiligten Tabellen zugeordnet werden - verwende einen Qualifier, so wie du es bei aadr.id auch getan hast.
Tja, das wollte ich dazugeschrieben haben, bei
LEFT JOIN getAdressen(4) aadr ON aadr.id = a.adressen_id
gibts die Fehlermeldung:
ERROR: invalid reference to FROM-clause entry for table "a"
SQL state: 42P01
Hint: There is an entry for table "a", but it cannot be referenced from this part of the query.
Danke btw. für die schnelle Antwort!
Gruß,
Manu
Ja, ich war wieder zu schnell beim Abschicken... Auch a.adressen_id as adrid ... LEFT OUTER JOIN getAdressen(4) aadr ON aadr.id = adrid gibt den Fehler aus dem ersten Posting...seltsam, denn das zweite left join funktioniert ja :(
Gruß,
Manu
Hello,
Ja, ich war wieder zu schnell beim Abschicken... Auch a.adressen_id as adrid ... LEFT OUTER JOIN getAdressen(4) aadr ON aadr.id = adrid gibt den Fehler aus dem ersten Posting...seltsam, denn das zweite left join funktioniert ja :(
halt stopp, NICHT im ON-Teil das Ergebnis des SELECT verwenden. Damit legt sich so manches DBMS an, ist immer ein Glücksspiel. Nimm Tabelle.Spaltenname, nicht den Alias.
MfG
Rouven
ehm...würd ich ja gerne, aber ich benutze ja eine sp...
Hello,
Hint: There is an entry for table "a", but it cannot be referenced from this part of the query.
siehst du, die Datenbank ist genau so verwirrt wie ich ob der Mischung von implizit und explizit bei den Joins. Vmtl. führt sie zunächst die expl. Joins aus, dann den Rest. Versuch doch mal, überall die explizite Syntax zu verwenden.
Ansonsten - holla die Waldfee, SP als Quelle in einem Join, that's a first... das hab ich noch nicht gesehen.
MfG
Rouven
Mich wundert halt etwas, warum das zweite join anstandslos funktioniert.
Hmm, mir ist nicht ganz klar, wie Du das meinst - überall explizit? Du meinst, alles über joins?
Hello,
Hmm, mir ist nicht ganz klar, wie Du das meinst - überall explizit? Du meinst, alles über joins?
ja, das mein ich, aber dein Einwand mit den SPs ist berechtigt. Ich glaube, du hast ein größeres Problem :-) wobei, was hindert dich daran, wenn die SP einen Wert namens a heraus gibt und selbst mit dem Alias belegt ist, mit alias.a darauf zuzugreifen?
MfG
Rouven
Mit dem größeren Problem könntest Du leider recht haben...oO
Naja, meien getAnlagen() kann ich nicht einfach so ändern, die wird an zig Stellen im Projekt benutzt...
Ich schätze, ich werde um eine zweite Query nicht herumkommen...nicht so schön, denn die hier läuft schon 5min...
Gruß,
Manu
Hello,
ich überlege gerade - dein getAnlagen gibt doch auch nur eine Tabelle raus, also gibt es Spalten mit Namen, sonst könntest du nicht selektieren.
Wenn du nun "getAnlagen(3) meineAnlagen" schreibst, dann kannst du doch mit meineAnlagen.spaltenname auf die konkrete Spalte zugreifen.
MfG
Rouven
yo,
"column "adressen_id" does not exist".
diese fehlermeldung kann unabhängig von den sp durch die reihenfolge der joins hervorgerufen werden. hast du den den tipp von rouven immer expliziete joins zu verwenden überhaupt den schon probiert ?
Ilja