GROUP BY: Wenn Du doppelte Zeilen entfernen willst, schreibst Du besser SELECT DISTINCT. GROUP BY führt natürlich auch dazu, dass mehrfach auftretende Zeilen entfernt werden, ist aber eigentlich dafür da, innerhalb einer Gruppe mehrfacher Zeilen Werte zu aggregieren (SUM, AVG, COUNT, etc). Ich wusste bisher gar nicht, dass man GROUP BY überhaupt angeben darf, ohne eine solche Aggregationsfunktion in der SELECT Liste zu haben.
Mit der EXISTS Abfrage hat sich das Problem aber ohnehin erledigt, damit führen mehrfache 9er Status nicht mehr zu mehrfachen Sätzen.
Gültige Verträge: Du hast es indirekt gemacht, erst von Kontakten zu Aktivitäten und dann von Aktivitäten zu Vertragsköpfen. Das funktioniert natürlich (wegen A=B und B=C⟹A=C), es ist aber verständlicher, die Dinge so direkt wie möglich zu formulieren. Du suchst Verträge zum Kontakt, nicht Verträge zu einer Aktivität, oder?
Rolf