Henry: Mysql Vergleich mehrere Tabellen gleiche Spalte wert filtern

Hallo,

hatte ja schon ein paar Mal erwähnt, dass ich mit mysql extrem eingerostet bin (ist das eigentlich normal oder gehts euch auch so, wenn ihr jahrelang kaum noch was in einer Kategorie macht, das meiste zu vergessen? Alzheimerparanoia), daher…

Zwei Tabelle (aktivraw und aktivclean) habe ich, beide identisch, eine hat mehr Einträge. Nun versuche ich das abzugleichen anhand einer Spalte.

  • SELECT * FROM aktivraw JOIN aktivclean WHERE aktivraw.email = aktivclean.email

Soweit so gut, ich sehe dann nur die Reihen, die in beiden Tabellen vorkommen. Will ich aber nicht, sondern das Gegenteil. Also habe ich das versucht:

  • SELECT * FROM aktivraw JOIN aktivclean WHERE aktivraw.email != aktivclean.email

Scheint aber der falsche Ansatz zu sein, denn ich bekomme nun unfassbar viele Zeilen und die auch noch immer mit gleichen Werten also ein einzelner Eintrag tausende mal. Wo ist mein Denkfehler?

Gruss
Henry

--
Meine Meinung zu DSGVO & Co:
„Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
  1. Weiss nicht, ob es in MySql einen exklusiven full outer Join gibt. Mit UNION eventuell?

    SELECT * FROM aktivraw WHERE email NOT IN(SELECT email  FROM aktivclean)
    UNION
    SELECT * FROM aktivclean WHERE email NOT IN(SELECT email FROM aktivraw)
    
  2. Tach!

    Zwei Tabelle (aktivraw und aktivclean) habe ich, beide identisch, eine hat mehr Einträge. Nun versuche ich das abzugleichen anhand einer Spalte.

    Differenzen können mit Outer Joins gefunden werfen, gemeinhin nimmt man da einen Left Join. Was in der anderen Tabelle nicht da ist, zeigt NULL-Werte im Ergebnis. Danach kannst du dann in der Having-Klausel einschränken.

    Ein anderer Ansatz ist, erstmal die IDs der zweiten Tabelle zu ermitteln und diese Query als Subquery in ein WHERE id_erste_tabelle NOT IN(...) zu schreiben. (Email in deinem Fall statt ID.)

    • SELECT * FROM aktivraw JOIN aktivclean WHERE aktivraw.email != aktivclean.email

    Scheint aber der falsche Ansatz zu sein, denn ich bekomme nun unfassbar viele Zeilen und die auch noch immer mit gleichen Werten also ein einzelner Eintrag tausende mal. Wo ist mein Denkfehler?

    Alle Zeilen außer einer treffen jeweils auf die Bedingung zu. Das ergibt ein schönes großes kartesisches Produkt.

    dedlfix.

    1. Hallo dedlfix,

      Differenzen können mit Outer Joins gefunden werden

      Yup

      gemeinhin nimmt man da einen Left Join.

      Kommt drauf an. Wenn ich genau weiß, dass die Rows in einer der Tables allesamt in der anderen Table enthalten sind, kann ich das machen.

      Wenn ich das nicht weiß, mache ich einen OUTER JOIN

      Was in der anderen Tabelle nicht da ist, zeigt NULL-Werte im Ergebnis.

      Ja. Im Falle des OUTER JOIN wäre dann in einer der beiden Tables die Email-Adresse NULL.

      Danach kannst du dann in der Having-Klausel einschränken.

      Hm. Die Reihenfolge im logischen SQL Ausführungsmodell ist:

      • Tabellen JOINen
      • Rows gemäß WHERE filtern (die ONs in JOINs sind letztlich auch nur verkappte WHEREs)
      • Gruppieren und aggregieren
      • gruppierte und aggregierte Rows gemäß HAVING filtern

      (die physische Ausführung mag abweichen, das ist Sache des Optimizers)

      HAVING müsste demnach also funktionieren, ist aber eigentlich das falsche Werkzeug. Die NULL Prüfung gehört mNn in die WHERE Stufe.

      Ein anderer Ansatz ist (...) NOT IN

      Das mag effizienter sein, weil der Server nicht erstmal JOINen und dann ausfiltern muss. Es wird auch keine unnötig breite Zwischenergebnismenge aufgebaut. Es gilt aber das Gleiche wie für den LEFT JOIN: man findet damit nur den Überschuss in einer Tabelle. Gibt's in beiden Tabellen unpaarige Sätze, muss man es zweimal machen.

      Rolf

      --
      sumpsi - posui - clusi
  3. Hi,

    ist das eigentlich normal oder gehts euch auch so, wenn ihr jahrelang kaum noch was in einer Kategorie macht, das meiste zu vergessen?

    bei mir ist es meist erstmal die Vorstufe zum Vergessen: Ich bin mir sicher, ich wusste es mal, wie war das noch gleich ...

    Wenn ich mich dann wieder intensiver mit dem Thema befasse, bin ich aber normalerweise ruck-zuck wieder auf der Schiene. Das vermeintlich vergessene Wissen ist also bloß ein bisschen in den Hintergrund gerückt und braucht einfach nur ein Refresh.

    Und dann gibt's noch den psychologischen Effekt, dass man bestimmte Informationen unbewusst verdrängt, dass das Gehirn also das Vorhandensein einer Information verleugnet, z.B. weil diese Information mit einem sehr unangenehmen Erlebnis in Verbindung steht.

    So long,
     Martin

    --
    Computer müssen weiblich sein: Eigensinnig, schwer zu durchschauen, immer für Überraschungen gut - aber man möchte sie nicht missen.