Hallo dedlfix,
es entsteht kein kartesisches Produkt. So wie ich den Begriff verstehe, steht er für alle möglichen Paarungen aus 2 Tabellen (oder n-Tupel aus N Tabellen). D.h. bei 10 city-Rows und 12 datensatz-Rows würde das kartesische Produkt 120 Rows umfassen. Hier wird aber eine ON Klausel gesetzt und das reduziert das kartesische Produkt auf die möglichen Paarungen mit gleicher Stadt. Bei einem LEFT JOIN also im worst case - äh, knobel - 21 Rows.
In dem Fall musst du die Daten der zweiten Tabelle soweit einschränken, wie du sie haben möchtest, bevor das Join wirkt.
Wie gesagt: ON Klausel. Die Einschränkung ist da. Weitere Einschränkungen kann man natürlich machen, entweder im ON, um den JOIN selbst zu beschränken, oder nachher im WHERE, um das JOIN-Ergebnis zu beschränken. Ob der SQL Server eine WHERE Einschränkung vor, während oder nach dem JOIN anwendet, ist aber Sache des Query Optimizers und sollte dem SQL-Verfasser egal sein. Sollte... Es gibt natürlich Queries, die der Optimizer nicht in den Griff bekommt und die man durch Umformulieren performanter machen kann. Aber das hängt dann auch am DBMS, wie gut der Optimizer ist.
Ob man einen JOIN oder Subselect verwendet, sollte (sofern ein Subselect die Anforderungen erfüllen kann) der Performance oder dem Abfrageergebnis egal sein. Es gibt Argumente pro und contra Join, was die Lesbarkeit oder Verständlichkeit angeht, die haben wir oft genug gewechselt…
Meine eigene Mutmaßung zu dem, was passiert, habe ich in einem anderen Posting aufgeschrieben.
Rolf
sumpsi - posui - obstruxi