Ankündigung

Einklappen
Keine Ankündigung bisher.

Join welches immer einen Match bringt

Einklappen

Neue Werbung 2019

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

  • Join welches immer einen Match bringt

    Hallo,
    Ich habe folgendes Problem.

    Ich habe eine Table die etwa so aussieht:

    table1:
    Id | data1 | data2
    ------------------
    01 | a | b
    02 | c | d
    03 | e | f


    Ich will einen Join mit einer Table die etwa folgendermaßen aussieht:

    table2:
    Id | type | data3
    ------------------
    01 | 2 | z
    01 | 25 | yy
    02 | 29 | x
    03 | 5 | u
    03 | 22 | v
    03 | 25 | xx


    Der Join soll über einen Match bei der "Id" stattfinden.
    Ich will jedoch nur die Matches mit type 25.

    Problem:
    Vom type "25" gibt es jedoch entweder eine Zeile zu einer "Id", oder keine.
    Ich will jedoch immer ein Match mit jeder Id aus table1.


    Das bekomme ich:
    table1+table2:
    Id | data1 | data2 | type | data3
    ---------------------------------
    01 | a | b | 25 | yy
    03 | e | f | 25 | xx


    Das will ich:
    table1+table2:
    Id | data1 | data2 | type | data3
    ---------------------------------
    01 | a | b | 25 | yy
    02 | c | d | 25 | unknown
    03 | e | f | 25 | xx



    So sieht mein SQL-Statement im Prinzip aktuell aus:
    SELECT t1.Id, t1.data1, t1.data2, t2.type, t2.data3
    FROM table1 as t1
    LEFT JOIN table2 AS t2 ON t1.Id=t2.Id
    WHERE t2.type=25



    Was kann man da machen?

  • #2
    Die Prüfung auf "type" muss mit in die ON Klausel, oder du musst im WHERE berücksichtigen das "type" NULL sein kann.

    Kommentar


    • #3
      Zitat von erc Beitrag anzeigen
      Die Prüfung auf "type" muss mit in die ON Klausel
      +

      Zitat von erc Beitrag anzeigen
      , oder du musst im WHERE berücksichtigen das "type" NULL sein kann.
      ?

      ​​​​​​​

      Kommentar


      • #4
        Nu helft dem doch mal, kann doch nicht sooo schwer sein ...

        Code:
        test=*# select * from t1;
         id | data1 | data2
        ----+-------+-------
         01 | a     | b
         02 | c     | d
         03 | e     | f
        (3 Zeilen)
        
        test=*# select * from t2;
         id | type | data3
        ----+------+-------
         01 |    2 | z
         01 |   25 | yy
         02 |   29 | x
         03 |    5 | u
         03 |   22 | v
         03 |   25 | xx
        (6 Zeilen)
        
        test=*# select t1.id, t1.data1, t1.data2, coalesce(t2.type,25), coalesce(t2.data3,'unknown') from t1 left join t2 on (t1.id=coalesce(t2.id,t1.id) and t2.type=25);
         id | data1 | data2 | coalesce | coalesce
        ----+-------+-------+----------+----------
         01 | a     | b     |       25 | yy
         02 | c     | d     |       25 | unknown
         03 | e     | f     |       25 | xx
        (3 Zeilen)
        
        test=*#
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          noch in schön mit passenden Spaltenbezeichnern:

          Code:
          test=*# select t1.id, t1.data1, t1.data2, coalesce(t2.type,25) as type, coalesce(t2.data3,'unknown') data3 from t1 left join t2 on (t1.id=coalesce(t2.id,t1.id) and t2.type=25);
           id | data1 | data2 | type |  data3  
          ----+-------+-------+------+---------
           01 | a     | b     |   25 | yy
           02 | c     | d     |   25 | unknown
           03 | e     | f     |   25 | xx
          (3 Zeilen)
          
          test=*#
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            akretschmer : erc hat doch sein Problem bereits gelöst. Für C&P-Lösungen fehlt die Information welche Datenbank benutzt wird. Nun für PostgreSQL hat er diese jetzt ja ..

            Kommentar


            • #7
              Zitat von jspit Beitrag anzeigen
              + ?​​​​​​​
              So
              Code:
              SELECT t1.Id, t1.data1, t1.data2, t2.type, t2.data3
              FROM table1 as t1
              LEFT JOIN table2 AS t2 ON t1.Id=t2.Id AND 
              t2.type=25
              oder so
              Code:
              SELECT t1.Id, t1.data1, t1.data2, t2.type, t2.data3
              FROM table1 as t1
              LEFT JOIN table2 AS t2 ON t1.Id=t2.Id
              WHERE t2.type=25 OR t2.type IS NULL
              Die Queries machen u.U. nicht 100% das gleiche (wenn t2.type selbst null sein kann), ist aber fürs Verständnis hilfreich.

              Zitat von jspit Beitrag anzeigen
              Für C&P-Lösungen fehlt die Information welche Datenbank benutzt wird.​​​​​​​
              Für einen LEFT JOIN ist die Datenbank eher unrelevant. Ich poste i.d.R. selten fertige Lösungen. Die, die nur Code haben wollen, haben damit pech. Die, die etwas lernen wollen, lernen so vielleicht etwas mehr.

              Kommentar


              • #8
                Zitat von erc Beitrag anzeigen

                oder so
                Code:
                SELECT t1.Id, t1.data1, t1.data2, t2.type, t2.data3
                FROM table1 as t1
                LEFT JOIN table2 AS t2 ON t1.Id=t2.Id
                WHERE t2.type=25 OR t2.type IS NULL
                liefert bei mir nur
                Code:
                "Id"  "data1"  "data2"  "type"  "data3"
                "1"    "a"      "b"      "25"    "yy"
                "3"    "e"      "f"      "25"    "xx"
                Deshalb das ?.

                Die Variante 1 dagegen ist ok.
                Code:
                "Id"    "data1"    "data2"    "type"    "data3"
                "1"    "a"    "b"    "25"    "yy"
                "2"    "c"    "d"    (NULL)    (NULL)
                "3"    "e"    "f"    "25"    "xx"

                Kommentar


                • #9
                  Schau dir dein Query nochmal genau an, oder poste den hier. Das funktioniert definitv auch so.

                  Kommentar


                  • #10
                    Hab mal ein Fiddle gemacht: http://www.sqlfiddle.com/#!9/45de6/1

                    Kommentar


                    • #11
                      Das mit der Where-Klausel funktioniert nicht, die kegelt einfach die Datensätze raus bei denen der Join zwar ein Ergebnis hat (findet?), aber der type nicht 25 ist.

                      select t1.id, t1.data1, t1.data2, coalesce(t2.type,25), coalesce(t2.data3,'unknown') from t1 left join t2 on (t1.id=coalesce(t2.id,t1.id) and t2.type=25);
                      akretschmer
                      Das coalesce im Join ist nicht notwendig, oder? Die Zeile bleibt durch den left join ja eh im Resultset.
                      Oder macht das irgendwas besonderes, was mir gerade nicht auffällt
                      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                      Kommentar


                      • #12
                        Soviel zum Thema 100% sicher Ja, ist quatsch. War gedanklich schon bei einer 1:1 Beziehung.

                        Kommentar


                        • #13
                          Zitat von VPh Beitrag anzeigen
                          akretschmer
                          Das coalesce im Join ist nicht notwendig, oder? Die Zeile bleibt durch den left join ja eh im Resultset.
                          Oder macht das irgendwas besonderes, was mir gerade nicht auffällt
                          Reine Kosmetik, damit anstelle von null ein Resultat (mit 25 bzw. unknown) genau so rauskommt wie im Startbeitrag unter "Das will ich ".

                          Kommentar


                          • #14
                            Aber das passiert ja schon im Select-Teil des Statements.
                            [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                            [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                            Kommentar


                            • #15
                              Ja das stimmt, ist überflüssig.
                              Im Grunde reicht in Postgres folgendes
                              Code:
                              SELECT t1.id, t1.data1, t1.data2, '25' as type, coalesce(t2.data3,'unknown') data3
                              FROM table1 t1
                              LEFT JOIN table2 t2
                                  ON t1.id=t2.id
                                  AND t2.type =25;
                              und in MySQL
                              Code:
                              SELECT t1.Id, t1.data1, t1.data2, '25' AS TYPE , (
                                  CASE
                                      WHEN t2.data3 IS NULL
                                      THEN "unknown"
                                      ELSE t2.data3
                                  END
                                  ) AS data3
                              FROM table1 t1
                              LEFT JOIN table2 t2
                                  ON t1.Id=t2.Id
                                  AND t2.type =25
                              ORDER BY id
                              Damit genau das rauskommt was der TE gewünscht hat.

                              Kommentar

                              Lädt...
                              X