Die On-Klausel kann fast wie eine Where-Klausel gesehen werden:

on a.Key = b.Key and a.key2=b.key2 and b.key3='XX' ...

Ausdrücke und casts sind da auch erlaubt.

Der wesentliche Unterschied zwischen Join und exists ist, dass der Join ggf. mehrere Ergebnisse liefert und somit die Ergebnisse der Haupttabelle mehrfach vorkommen können.
Im Exists wird nur 1 Zugriff durchgeführt (nach Möglichkeit natürlich über einen Index, sonst dauerts).