Hola, imposible no pero bastante elaborado si. Creo q como te dice ñuño una tabla intermedia, o un rediseño te lo optimizaria bastante. Lo q yo tenia pensado para solucionarlo
Código SQL
[-]
select (select idcontratos from contratos) as idcontratos,
(select first(idparte) from partes where idcontratos = contratos.idcontratos) as id1,
(select first(idparte) from partes where idcontratos = contratos.idcontratos and idparte <> id1) as id2,
(select first(idparte) from partes where idcontratos = contratos.idcontratos and idparte <> id1 and idparte <> id2) as id3,
(select first(idparte) from partes where idcontratos = contratos.idcontratos and idparte <> id1 and idparte <> id2 and idparte <> id3) as id4,
(select empresa from partes where idparte = id1) as empresa1,
(select empresa from partes where idparte = id2) as empresa2,
(select empresa from partes where idparte = id3) as empresa3,
(select empresa from partes where idparte = id4) as empresa4,
fechaentrada ...
luego no mostrando los campos id1,id2,id3,id4. Seria mas elegante recoger todos los campos 'idparte where idcontratos = contratos.idcontratos' y colocarlos en un 'array', para que luego mediante un where in [...] seleccionar las empresas, o bien mediante un bucle usando for... Desconozco bien bien como funcionan los bucles y arrays en sql, por lo que no pongo nada mas, pero es probable que se pueda hacer asi. Saludos.