Ankündigung

Einklappen
Keine Ankündigung bisher.

Kann man einen LEFT JOIN dazu bringen, Spalten aus der linken Tabelle zu bevorzugen?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kann man einen LEFT JOIN dazu bringen, Spalten aus der linken Tabelle zu bevorzugen?

    Kann man irgendwie erzwingen, dass bei einem LEFT JOIN bei gleichnamigen Spalten in beiden Tabellen, die Spalten aus der linken Tabelle übernommen werden? Insbesondere bei der Spalte über die der JOIN erfolgt. Oder muß man zwingend eindeutige Alias-Namen vergeben?

    Das war schon meine Frage auf den Punkt gebracht. Die Langfassung folgt:

    ich habe zwei Tabellen
    Code:
    a_table                          b_table
    a_id | common_id                 b_id | common_id
    -----+----------                 -----+----------
    1    | eins                      10   | eins
    2    | zwei                      20   | zwei
    3    | drei
    die ich mit einem LEFT JOIN verknüpfe:

    Code:
       SELECT *
         FROM a_table a
    LEFT JOIN b_table b
           ON a.common_id = b.common_id
    Das Ergebnis ist:
    Code:
    a_id | common_id | b_id
    -----+-----------+-----
    1    | eins      | 10
    2    | zwei      | 20
    3    |           |
    Getestet mit PDO (jeweils mit einer SQLite- und einer MySQL-Datenbank) sowie mit SQlite3.

    Gewünscht wäre natürlich, dass in der Zeile a_id = 3 die common_id "drei" aus der linken Tabelle aufscheint.

    Der DB Browser for SQLite macht übrigens genau das!

  • #2
    das Ergebniss ist eher:

    Code:
    edb=*# select * from a_table a left join b_table b on a.common_id=b.common_id;
     a_id | common_id | b_id | common_id 
    ------+-----------+------+-----------
        3 | drei      |      | 
        1 | eins      |   10 | eins
        2 | zwei      |   20 | zwei
    (3 rows)
    Wenn Du jetzt in der Applikation die ersten 3 Spalten nimmst, hast Du geinen Wunsch. Zumindest solange, wie sich nichts an der Tabellenstruktur ändert. Warum will man so ein unsicheres Konstrukt?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Kannst du das nicht über CASE machen?

      Code:
      select
              a_id,
              CASE
                    WHEN a.common_id IS NOT NULL THEN a.common_id
                    ELSE b.common_id
              END as common_id,
              b.id
      from a_table a
      left join b_table b on a.common_id=b.common_id

      Kommentar


      • #4
        Zitat von Anyone Beitrag anzeigen
        Kannst du das nicht über CASE machen?

        Code:
        select
        a_id,
        CASE
        WHEN a.common_id IS NOT NULL THEN a.common_id
        ELSE b.common_id
        END as common_id,
        b.id
        from a_table a
        left join b_table b on a.common_id=b.common_id
        ja, oder einfacher via COALESCE():

        Code:
        edb=*# select a.a_id, coalesce(a.common_id, b.common_id), b.b_id from a_table a left join b_table b on a.common_id=b.common_id;
         a_id | coalesce | b_id 
        ------+----------+------
            3 | drei     |     
            1 | eins     |   10
            2 | zwei     |   20
        (3 rows)
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Oder man selektiert einfach das Feld was man haben möchte und nicht alles!?
          PHP-Code:
          SELECT a.a_idb.b_ida.common_id FROM ... 

          Kommentar


          • #6
            Zitat von erc Beitrag anzeigen
            Oder man selektiert einfach das Feld was man haben möchte und nicht alles!?
            PHP-Code:
            SELECT a.a_idb.b_ida.common_id FROM ... 
            or nöööö, das wäre zu einfach.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Kann man irgendwie erzwingen, dass bei einem LEFT JOIN bei gleichnamigen Spalten in beiden Tabellen, die Spalten aus der linken Tabelle übernommen werden? Insbesondere bei der Spalte über die der JOIN erfolgt. Oder muß man zwingend eindeutige Alias-Namen vergeben?
              Bei gleichlautenden Feldern musst du einen Prefix verwenden, sonst meckert die Datenbank (ambigous).
              Es ist legitim beide Felder unter dem gleichen Namen zu selektieren, solange sie eindeutig aufgelöst werden können, aka: "SELECT a.id, b.id FROM ... " (Tabelle oder Alias.Feldname)
              Nachteil ist, das in einem assoc. Array beide Felder gleich heissen, ohne den Prefix. Dadurch überschreibt der zuletzt auftauchende Werte die vorherigen.
              Hier kommt das Alias ins Spiel... oder man benutzt ein nummeriertes Array, dann löst sich das Problem auch auf.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Oder man selektiert einfach das Feld was man haben möchte und nicht alles!?
                or nöööö, das wäre zu einfach.
                Ihr habt ja so recht! Ich war gestern zu blockiert und wollte unbedingt SELECT * verwenden statt dutzende Spaltennamen aufzuführen (<suppenkaspar>Ich schreibe meine Spalten nicht, nein meine Spalten schreib ich nicht</suppenkaspar>). Aber es führt kein Weg dran vorbei...

                Ausserdem habe ich umgeplant und werde einen FULL OUTER JOIN verwenden (bzw. unter SQLite emulieren) und da kann ich die Anregung zu CASE bzw. COALESCE() für den gemeinsamen Spaltennamen gut verwenden.

                Danke euch allen fürs auf den richtigen Weg schubsen und eure Anregungen!

                Kommentar


                • #9
                  *hier stand quatsch*
                  Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

                  Kommentar

                  Lädt...
                  X