Manu: Left Join funktioniert nicht

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

--
Vegetarier essen meinem Essen das Essen weg.
  1. Hello,

    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)

    OK, mir stellen sich gerade die Nackenhaare hoch...

    1. 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
    2. was ist getVertragskonden(4) etc., sind das Tabellennamen??
    3. 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.

    MfG
    Rouven

    --
    -------------------
    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
    1. Hi!

      OK, mir stellen sich gerade die Nackenhaare hoch...

      Hui, sehen will! ;D

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

      1. was ist getVertragskonden(4) etc., sind das Tabellennamen??

      Nee, SP's - damit bekomme ich über eine Version (hier 4) alle zugehörigen Daten

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

      --
      Vegetarier essen meinem Essen das Essen weg.
      1. 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

        --
        Vegetarier essen meinem Essen das Essen weg.
        1. 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

          --
          -------------------
          There's no such thing as a free lunch  --  Milton Friedman
          1. ehm...würd ich ja gerne, aber ich benutze ja eine sp...

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

        --
        -------------------
        Ambition is the last refuge of failure.  --  Oscar Wilde (Irish Poet, Novelist, Dramatist and Critic, 1854-1900)
        1. 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?

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

            --
            -------------------
            Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
            1. 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

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

                --
                -------------------
                Vegetarier essen meinem Essen das Essen weg.
  2. 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