SQL lida com tabelas. Por definição, uma tabela tem um monte de linhas, cada uma com as mesmas colunas que a outra. Sua consulta vai gerar um conjunto de resultados que duplica as informações do cliente para cada curso que ele fez.
Sua camada de apresentação vai formatar essa tabela, observando a primeira linha de cada novo cliente e quebrando o cabeçalho do cliente. Você fará isso em php ou Java ou Crystal Reports ou alguma tecnologia de apresentação.
Sua consulta é algo assim.
SELECT a.id, a.name, a.address, a.etc,
c.Name
FROM Clients a
JOIN CoursesForClients b USING(ClientID)
JOIN Courses c USING(CourseID)
ORDER BY a.id, c.CourseID
@Strawberry faz um bom ponto sobre a armadilha de usar
USING()
. Aqui está a mesma consulta em ON
. SELECT a.id, a.name, a.address, a.etc,
c.Name
FROM Clients a
JOIN CoursesForClients b ON a.ClientID = b.ClientID
JOIN Courses c ON b.CourseID = c.CourseID
ORDER BY a.id, c.CourseID