Hallo Manon,
eine Ergänzung: die UNION-Lösung ändert ggf. die Reihenfolge der Sätze. Wie genau, hängt vom Execution Plan ab, den dein SQL Server für deine LEFT JOIN Kette gewählt hat, aber ich nehme mal an, dass es vorher eine nested loop war wo er für jeden Satz aus der a Tabelle einen Seek in die abhängigen Tabellen gemacht hat. D.h. die Ergebnissätze waren in Reihenfolge der Sätze aus Tabelle a.
Durch den UNION wird das getrennt, du bekommst zuerst alle Sätze mit typ=1 oder typ=2, und dann alle anderen. Wenn das stört, musst Du noch einen ORDER BY nachlegen (der wirkt auf das UNION-Ergebnis) - aber das sollte immer noch schneller sein als die unnötigen SEEKs in der LEFT JOIN Kette. Wenn sie denn überhaupt ausgeführt werden - ein (a.typ=1) in der ON Bedingung könnte ja dazu führen, dass er für a.typ≠1 den SEEK überspringt.
Im Zweifelsfalls hilft da nur messen, EXPLAINs analyiseren und im Zweifelsfalls doch zur alten Lösung zurückkehren. Die ersten beiden LEFT JOIN kannst Du ja auf jeden Fall zusammenlegen, wenn Du im ON ein (a.typ=1 OR a.typ=2) AND a.id=aa.id_field verwendest.
Vielleicht ist das schon die einfachste Lösung. Man baut ein System zu Optimierungszwecken nur dann gravierend um, wenn es nötig ist.
Rolf
sumpsi - posui - clusi