Bạn có thể sử dụng một biến để kiểm tra xem id cuối cùng có bằng với id hiện tại hay không và trong trường hợp đó xuất ra null hoặc '' để thay thế.
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
Ví dụ: http://sqlfiddle.com/#!2/658e4c/6
Lưu ý, điều này là một chút hacky. Tôi đã cố tình đặt ClientId thành trường thứ hai, vì vậy tôi có thể thay đổi và trả về biến clientId trong cùng một trường. Trong các trường hợp khác, phức tạp hơn, bạn có thể phải làm điều đó trong một trường riêng biệt. Nhưng để loại bỏ trường giữ chỗ đó khỏi kết quả, bạn sẽ phải nhúng toàn bộ truy vấn vào một lựa chọn phụ và xác định các trường mong muốn theo đúng thứ tự trên truy vấn cấp cao nhất.