1) Il problema delle righe doppie non è risolvibile: se un id è ripetuto nella tabella anagrafica_dipiu significherà, presumibilmente, che le righe di quella tabella avranno dati diversi, quindi è giusto che la join venga fatta più volte
2) La query è effettivamente migliorabile perché non serve una subselect a tre livelli
3) In base a quello che hai scritto la join con la tabella attività è inutile
codice:
select a.*, d.* from anagrafica as a join anagrafica_dipiu as d on a.id_anagrafica = d.id_anagrafica
where a.id_attivita = x and data_isc between y and z
Questa è la versione che comprende anche la join con la tabella attività, che però è inutile se non estrai i dati relativi:
codice:
select a.*, d.* from anagrafica as a join anagrafica_dipiu as d on a.id_anagrafica = d.id_anagrafica join attivita as at on a.id_attivita = at.id_attivita
where a.id_attivita = x and data_isc between y and z