SQL Differenz eines JOINs

meisteralex

Lieutenant
Registriert
Juni 2003
Beiträge
552
Hi leute, ich habe 2 Tabellen, und will aus der ersten Tabelle nur diejenigen Einträge haben, welche keinen entsprechenden Eintrag in der zweiten besitzen
Verknüpft werden die beiden Tabellen über die Felder t1.user_id = t2.user_id, ich möchte nun alle aus t1 haben, welche keinen eintrag in t2 besitzen ?
Wie mach ich das ?
 
Mit Subselect:
select * from t1 where not exists(select null from t2 where t1.user_id = t2.user_id)

Mit Outer-Join:
select t1.* from t1 left outer join t1 on t1.user_id = t2.user_id where t2.user_id is null
 
Je nach verwendetem DBMS kann Variante 1 von ag3nt um Längen performanter sein, da eine halbwegs intelligente Datenbank hierfür einen Semi-Join (das ist ein Join, der keine Daten aus der gejointen Tabelle selektiert, sondern sie nur als Filter benutzt) macht. Oracle wäre z.B. ein Kandidat, der das sehr gut kann.
 
@7H3 N4C3R:
Das kommt aber auch auf die Daten selbst an. Pauschal beantworten lässt sich kaum welche der beiden Varianten schneller ist. Bei Reportings ist allerdings zumindest Varante 2 meistens schneller, aber das hängt wie gesagt sehr von der Struktur der Tabellen und DBMS selbst ab und nicht zu letzt von der Qualität des Optimizers. Abraten würde ich von Varante 1 allerdings immer dann wenn es sich um extrem viele Tupel handelt, da dann das DBMS häufig amok läuft und unsinnige Optimierungen vornimmt, die den Vorgang enorm verlangsamen. Allerdings führt das jetzt eindeutig zu weit, denn dann müsste man auch noch zig andere Varianten vergleichen ^^.
Ich hatte nur die 2 Varianten, da immer noch genug MySQL Versionen im Einsatz sind die keine Subselects unterstützten.
 
Zurück
Oben