Announcement

Collapse
No announcement yet.

join verstehen

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

  • join verstehen

    hi leute,

    ich habe in meiner datenbank folgenden code gefunden, wo ich mir net 100tig sicher bin was des eigentlich macht. ein teil davon ist:
    Code:
    SELECT a1.*, a2.*
    FROM table1 a1
    left join table2 a2 
    on a1.id = a2.id
    where a2.id is null
    verstehe ich das richtig, wenn ich davon ausgehe, dass dieser select alle einträge aus der tabelle a1 rausholt, die nicht in der tabelle a2 enthalten sind?

    bitte um bestätigung und ein schönes wochenende
    daman

  • #2
    Hi,

    du bekommst hier alle Daten aus der Tabelle A auch wenn diese in Tabelle B nicht zu finden sind.

    Tabelle A == 100 %
    Tabelle B == Teilmenge die mit A übereinstimmt.

    Wenn du alle Daten willst die in Tabelle A sind und nicht in Tabelle B dann musst du über einen INNER JOIN gehen.

    Code:
    SELECT a1.*, a2.*
    FROM table1 a1
    INNER join table2 a2 
    on a1.id = a2.id
    where a2.id is null
    Gruss

    Michael
    http://www.mschnuerer.de

    Comment


    • #3
      Hallo Michael,

      leider hast du unrecht. Die einfachste Variante dfür wäre die Verwendung von EXCEPT.
      Hier was zum ausprobieren (das Ergebnis sollte die Zeile mit 2,'B' aus #t1 sein):
      Code:
      create table #t1 (id int, feld varchar(9))
      create table #t2 (id int, feld varchar(9))
      
      insert into  #t1 select 1, 'A'
      insert into  #t1 select 2, 'B'
      insert into  #t2 select 1, 'A'
      insert into  #t2 select 2, 'C'
      
      -- deine Variante ...
      
      SELECT a1.*, a2.*
      FROM #t1 a1
      INNER join #t2 a2 
      on a1.id = a2.id
      where a2.id is null
      
      -- die Variante des Fragestellers ...
      
      SELECT a1.*, a2.*
      FROM #t1 a1
      left join #t2 a2 
      on a1.id = a2.id
      where a2.id is null
      
      -- das liefert die Zeile, die in #t1 aber nicht in #t2 vorkommt ...
      
      select * from #t1
      except 
      select * from #t2
      
      drop table #t1
      drop table #t2
      bye,
      Helmut

      Comment


      • #4
        Hallo Helmut,

        mit dem Inner Join würde er doch genau das Ergebnis bekommen, das er möchte.

        Mit EXCEPT ist es nur ein anderer Weg.

        Oder bin ich da total auf dem Holzweg?

        Gruss

        Michael
        http://www.mschnuerer.de

        Comment


        • #5
          OK hab meinen Fehler gefunden.

          Du hast Recht. Habe das WHERE nicht beachtet.

          Bin auch davon ausgegangen, dass er alles aus Tabelle A möchte und die passenden Sätze aus B. Aber halt auch alles aus A auch wenn für den Datensatz aus A keine Inhalte in der Tabelle B vorhanden sind.
          Und da wäre dann auch die Variante des Fragestellter richtig wenn man das WHERE nicht beachtet.

          Da hab ich die Join's dann mal wieder selbst durcheinander gebracht.

          Aber auch wieder etwas dazugelernt.

          Sorry

          Gruss

          Michael
          http://www.mschnuerer.de

          Comment


          • #6
            merci leute

            Comment


            • #7
              Hallo Daman,
              mit deiner Vermutung im ersten Kommentar liegst du genau richtig.


              MiSchn1980's Aussage ist falsch
              du bekommst hier alle Daten aus der Tabelle A auch wenn diese in Tabelle B nicht zu finden sind.
              Nicht "auch" sondern, "nur diese"

              und seine Abfrage macht keinen Sinn.
              PHP Code:
              SELECT a1.*, a2.*
              FROM table1 a1
              INNER join table2 a2 
              on a1
              .id a2.id
              where a2
              .id is null 
              INNER JOIN, bedeutet, dass nur Datensätze angezeigt werden,
              bei denen die verknüpften Spalten von Tabelle1 und Tabelle2 übereinstimmen.
              Deshalb kann es niemals einen Datensatz geben
              bei denen eine Spalte des INNER JOIN im "ON" steht und beim WHERE NULL ist (wie es hier mit a2.id versucht wird).
              Und Falk Prüfer sprach: Formatierung von SQL in Beiträgen

              Comment


              • #8
                Hey knoxyz,

                vor dem Posten erst alles lesen.

                Das Thema war schon lang beendet.

                Gruß

                Michael
                http://www.mschnuerer.de

                Comment


                • #9
                  Trotzdem hat knoxyz Recht.
                  docendo discimus

                  Comment


                  • #10
                    Es hat ja auch niemand gesagt, dass er nicht recht hat. Oder?

                    Man kann auch Themen die längst geklärt sind tot reden!

                    Meinen fehler habe ich oben auch zu gegeben und noch etwas dazu geschrieben. Denke es sollte jetzt genug sein.
                    http://www.mschnuerer.de

                    Comment


                    • #11
                      Hi Mixhael,

                      das was Du dazu geschrieben hast, war aber auch nicht hundertprozentig verständlich.

                      Ich meine Deinen letzten Satz:
                      "Und da wäre dann auch die Variante des Fragestellter richtig wenn man das WHERE nicht beachtet."

                      Denn genau,wenn man das Where beachtet, ist die Aussage des Fragestellers richtig.

                      Gruß
                      docendo discimus

                      Comment

                      Working...
                      X