Newsgroup: it.comp.software.database
Titolo: Query da ottimizzare... e da far diventare più esatta

Ho 3 tab in PostgreSQL 7.4.8: anagrafica(...,
id_anagrafica,id_attivita,...),
anagrafica_dipiu(...,id_anagrafica,data_isc,...), attivita(...,
id_attivita,...).
Relazioni:
1) anagrafica - anagrafica_dipiu relazione 1 a molti tramite
id_anagrafica (nella prima chiave primaria, nella seconda esterna,
quindi si può ripetere);
2) anagrafica - attivita tramite id_attivita relazione molti a 1
(nella seconda chiave primaria)
3) anagrafica_dipiu e attivita non sono collegate.
L'interrogazione è questa: selezionare i campi di anagrafica, alcuni
campi di anagrafica_dipiu in un range di data (che è contenuta in
anagrafica_dipiu ) e con un certo id_attivita.
La query che ho costruito è la seguente:
SELECT * from anagrafica inner join
(SELECT anagrafica_dipiu.* FROM anagrafica_dipiu  INNER JOIN
(select distinct anagrafica_dipiu.id_anagrafica from anagrafica_dipiu
WHERE data_isc BETWEEN '$data_inizio' AND '$data_fine') as T1 ON
T1.id_anagrafica = anagrafica_dipiu.id_anagrafica
) as T2
ON T2.id_anagrafica = anagrafica.id_anagrafica
INNER JOIN attivita
ON anagrafica.id_attivita = attivita.id_attivita
Il problema è che non è proprio perfetta: se c'è un id_anagrafica che
compare 2 volte in anagrafica_dipiu mi viene ripetuto il record 2
volte.
Come faccio a risolvere il problema? E' possibile migliorare/
semplificare la query?!?!!??!?!!?
Ringrazio fin d'ora chi mi potrà essere d'aiuto!

 Ringrazio fin d'ora chi mi potrà essere d'aiuto!
ciao.
Scusa ma non capisco l'utilità della tabella anagrafica_dipiu.
In genere dati come data registrazione, ecc. vanno appunto
nella tabella anagrafica che è li apposta per quello :)
Inoltre non mi è chiaro come possa essere
presente più di un record con lo stesso id_anagrafica in
anagrafica_dipiu. Secondo me dovresti rivedere il disegno 
della base dati.
banalmente:
anagrafica
(id_anagrafica PK,
nome,
cognome,
data_iscrizione,
coloredegliocchi,
........
)
attività
(id_attività PK,
descrizione,
quellochetipare,
.......
)
anagrafica_attività
(id_anagrafica, ==> fk references anagrafica(id_anagrafica)
id_attività, ==> fk references attività(id_attività)
data_attività
.....
pk (id_anagrafica,id_attività) o al limite aggiungi anche la data
se questa può essere una discriminante.
)
ciao

semplificare la query?!?!!??!?!!?
Per risolvere il problema intanto bisognerebbe sapere quale dei 2 record ti 
interessa.
Supponendo che sia quello piů recente nel periodo (quelo con data maggiore) 
si potrebbe fare:
SELECT * from anagrafica
inner join anagrafica_dipiu  on anagrafica.id_anagrafica = 
anagrafica_dipiu.id_anagrafica
inner join attivita                 on anagrafica.id_attivita      = 
attivita.id_attivita
where data_isc = (select max(data_isc)
                            from anagrafica_dipiu t1
                            where t1.id_anagrafica=anagrafica.id_anagrafica
                               and data_isc BETWEEN '$data_inizio' AND 
'$data_fine')
...rimane sempre il problema se in anagrafica_dipiu possono esistere 2 
record con lo stesso id e la stessa data
hth
ciao
roberto

 record con lo stesso id e la stessa data
Si, per una serie di implicazioni che non sto a spiegare perchè troppo
lunga e noiosa (ci sono altri identificativi), possono esistere 2
record con lo stesso id e la stessa data. Quindi non mi resta che
provare a testare la soluzione che mi hai proposto.
Grazie per l'aiuto!

 della base dati.
Per quanto riguarda il tuo schema è tutto perfetto, non fa una piega,
sono perfettamente d'accordo con te.
Purtroppo per non allungare troppo il post ho cercato di omettere il
motivo di questa tabella aggiuntiva (anagrafica_dipiu), perchè è un
discorso abbastanza complesso e soprattutto noioso. Infatti proprio
per uno di questi motivi possono essere presenti 2 record con lo
stesso id_anagrafica, in quanto ci sono altri identificativi che
giocano un ruolo di rilevanza nello schema del db.
Grazie comunque per il tempo dedicatomi.