Du kan använda en variabel för att kontrollera om det sista ID:t är lika med det aktuella ID:t, och i så fall mata ut null eller '' istället.
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
Exempel:http://sqlfiddle.com/#!2/658e4c/6
Obs, det här är lite hackigt. Jag gjorde medvetet ClientId till det andra fältet, så att jag kunde ändra och returnera variabeln clientId i samma fält. I andra mer komplicerade fall kan du behöva göra det i ett separat fält. Men för att eliminera det platshållarfältet från resultatet måste du bädda in hela frågan i ett underval och definiera de önskade fälten i rätt ordning på den översta nivån.