Mysql Vergleich mehrere Tabellen gleiche Spalte wert filtern
Henry
- mysql
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.
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:
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
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)
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.
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:
(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
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