Announcement

Collapse
No announcement yet.

SQL JOIN funktioniert nicht so wie ich möchte

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL JOIN funktioniert nicht so wie ich möchte

    Ich habe zwei Tabellen.

    Tabelle A und Tabelle B


    Wenn ich

    SELECT *
    FROM TableA
    WHERE Condition1='bla' AND Condition2='bla2'

    erhalte ich als Ergebnis TabelleC.

    Nun möchte ich aber noch TabelleB mit der TabelleC verheiraten.
    Es sollen nur die Zeilen von TabelleB zu TabelleC hinzugefügt werden, welche 3 conditions erfüllen. Es müssen 3 Spaltenwerte übereinstimmen, damit die Reihe von B zu C hinzugefügt wird.


    Das Ding ist, dass ja TabelleC nicht so wirklich existiert. Was ich versucht habe bislang ist:

    SELECT *
    FROM TableA
    JOIN TableB
    ON (Spaltenwert1='x'
    AND Spaltenwert2='y'
    AND Spaltenwert3='z'
    WHERE Condition1='bla' AND Condition2='bla2';

    Das funktioniert aber nicht...


  • #2
    Das funktioniert aber nicht...
    Ist kein Fehler. Fehlermeldung? Ergebnis falsch? Wie soll es aussehen? Was kommt stattdessen?

    Der Join ist so falsch. Welcher Datensatz aus Tabelle A soll mit welchem aus Tabelle B verglichen werden?


    select * from TableA a
    join TableB b on a.id=b.id and b.Spaltenwert1='x' AND b.Spaltenwert2='y' AND b.Spaltenwert3='z'
    where
    a.Condition1='bla' AND a.Condition2='bla2';
    Zuletzt editiert von Christian Marquardt; 12.06.2020, 14:39.
    Christian

    Comment


    • #3
      Das wichtigste ist, dass Tabelle A erst gefilter wird mit den zwei conditions.

      SELECT *
      FROM TableA
      WHERE Condition1='bla' AND Condition2='bla2'

      Dann erhalte ich ca. 2000 Ausgaben, weil viele Duplikate drin sind.


      select * from TableA a
      join TableB b on a.id=b.id AND a.id1=b.id1 AND a.id2=b.id2 AND a.id3=b.id3
      where
      a.Condition1='bla' AND a.Condition2='bla2';


      Gibt mir 3500 Ausgaben. Irgendwas passt da nicht. Der Join verändert etwas, weil ja where nach dem join ausgeführt wird.

      Comment


      • #4
        Was ich brauche ist eine Filterung der Tabelle A, bevor ich sie dann mit einem LEFT JOIN mit Tabelle B verheirate
        Zuletzt editiert von Kickflip; 12.06.2020, 15:19.

        Comment


        • #5
          Das wichtigste ist, dass Tabelle A erst gefilter wird mit den zwei conditions.
          Nein, wieso. Die Filterung findet nach dem Join in der where Bedingung statt.

          Durch den Join werden die Daten aus Tabelle b geholt deren Bedingung nach dem on zutrifft
          Ev. benötigst du einen left join

          select * from TableA a
          left join TableB b on a.id=b.id AND a.id1=b.id1 AND a.id2=b.id2 AND a.id3=b.id3 Das bedeutet was? Vorher war das etwas anderes
          where
          a.Condition1='bla' AND a.Condition2='bla2';

          Zeige das Datenmodel von Tabelle A und B hier

          Aha, wir ändern jetzt die Sprache auf Englisch?
          Zuletzt editiert von Christian Marquardt; 12.06.2020, 15:15.
          Christian

          Comment


          • #6
            Hm, ne. Komme wieder auf 3500 Reihen, wobei 2000 die richtigen sind...

            Ich kann das im Anschluss ja auch nicht groupieren, um Duplicate zu entfernen oder?

            Comment


            • #7
              Zeige das Datenmodel von Tabelle A und B hier
              Christian

              Comment


              • #8
                A besteht aus:
                Spalten: straße, hausnummer, plz, ort, X, Y


                B besteht aus:
                Spalten: Breite, Höhe, straße, hausnummer, plz, ort

                Beide sind voll mit Duplikaten.
                Für die Identifizierung der Richtigen muss gelten:

                X IS NULL AND Y='on'

                Möchte abschließend die Höhe und Breite zu den Richtigen wissen.


                EDIT:

                SELECT *
                FROM TableA
                WHERE X IS NULL AND Y='on'

                gibt mir die Richtigen

                Comment


                • #9
                  select * from tableA a
                  left join tableB b on a.straße=b.straße and a.hausnummer=b.hausnummer and a.plz=b.plz and a.ort=b.ort
                  where a.X is null and a.Y='on'
                  Christian

                  Comment


                  • #10
                    Originally posted by Christian Marquardt View Post
                    select * from tableA a
                    left join tableB b on a.straße=b.straße and a.hausnummer=b.hausnummer and a.plz=b.plz and a.ort=b.ort
                    where a.X is null and a.Y='on'
                    Führt nicht zum gewollten Ergebnis.
                    Glaube, dass man das nicht so lösen kann. Die Datenbank ist einfach murks. Man müsste halt vor dem JOIN die Tabelle A filtern und danach dann Joinen. Aber das macht man ja generell so nicht

                    Comment


                    • #11
                      Das sollte das Ergebnis sein, außer du hast in Tabelle A mehrere gleiche Datensätze drin wo straße, hausnummer, plz und ort gleich sind und auch a.X is null and a.Y='on' sind
                      Man müsste halt vor dem JOIN die Tabelle A filtern
                      Das kannst du mit einer temp. Tabelle ja machen

                      https://www.techonthenet.com/mysql/t...e_table_as.php
                      Christian

                      Comment


                      • #12
                        Originally posted by Christian Marquardt View Post
                        Das sollte das Ergebnis sein, außer du hast in Tabelle A mehrere gleiche Datensätze drin wo straße, hausnummer, plz und ort gleich sind und auch a.X is null and a.Y='on' sind
                        Kann ja eigentlich nicht sein, weil dann ja

                        SELECT *
                        FROM TableA a
                        WHERE a.X IS NULL AND a.Y='on'

                        auch mehr als die Richtigen 2000 ausspuckt, oder?

                        Comment


                        • #13
                          Vielleicht nutzt das hier was

                          https://entwickler-forum.de/forum/da...einen-anzeigen

                          oder
                          select distinct(*) from tableA a
                          left join tableB b on a.straße=b.straße and a.hausnummer=b.hausnummer and a.plz=b.plz and a.ort=b.ort
                          where a.X is null and a.Y='on'
                          Christian

                          Comment


                          • #14
                            Originally posted by Christian Marquardt View Post
                            (...)
                            oder
                            select distinct(*) from tableA a
                            left join tableB b on a.straße=b.straße and a.hausnummer=b.hausnummer and a.plz=b.plz and a.ort=b.ort
                            where a.X is null and a.Y='on'
                            schmeißt mir einen Syntaxerror für das DISTINCT raus.
                            Das andere schaue ich mir an.

                            Comment


                            • #15
                              distinct *
                              ohne Klammern
                              Christian

                              Comment

                              Working...
                              X