Je kunt een variabele gebruiken om te controleren of de laatste id gelijk is aan de huidige id, en in dat geval in plaats daarvan null of '' uitvoeren.
select
case when c.ClientId <> @clientid then c.Name else '' end as ClientName,
case when c.ClientId <> @clientid then @ClientId := c.ClientId else '' end as ClientId,
p.ContactId,
p.Name as ContactName
from
Clients c
inner join Contacts p on p.ClientId = c.Clientid
, (select @clientid := -1) x
order by
c.ClientId, p.ContactId
Voorbeeld:http://sqlfiddle.com/#!2/658e4c/6
Let op, dit is een beetje hacky. Ik heb met opzet ClientId het tweede veld gemaakt, zodat ik de clientId-variabele in hetzelfde veld kon wijzigen en retourneren. In andere, meer uitgebreide gevallen moet u dat wellicht in een apart veld doen. Maar om dat tijdelijke veld uit het resultaat te verwijderen, moet u de hele query insluiten in een subselectie en de gewenste velden in de juiste volgorde definiëren op de bovenste query.