Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    170

    [sql] 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!

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    170
    Originariamente inviato da luca200
    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
    Si, in effetti c'è un valore in particolare che cambia (campo id_reg), ma in questo caso non mi interessa, mi serve estrarre solamente una volta quell'id_anagrafica
    2) La query è effettivamente migliorabile perché non serve una subselect a tre livelli
    Sembra molto semplice da come l'hai scritta, provo a vedere se funziona
    3) In base a quello che hai scritto la join con la tabella attività è inutile
    Mi serve perchè nella tab anagrafica c'è l'id, mentre nella tab attivita c'è anche la descrizione del nome (non l'ho scritto per non allungare troppo il post), quindi mi va bene la seconda soluzione che mi hai proposto.

    Ora provo la soluzione che mi hai suggerito, nel frattempo ti ringrazio per l'aiuto.

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da xmaxfane
    Si, in effetti c'è un valore in particolare che cambia (campo id_reg), ma in questo caso non mi interessa, mi serve estrarre solamente una volta quell'id_anagrafica
    Prova ad aggiungere in fondo GROUP BY a.id_anagrafica

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    170
    Originariamente inviato da luca200
    Prova ad aggiungere in fondo GROUP BY a.id_anagrafica
    Se lo aggiungo così
    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 GROUP BY a.id_anagrafica
    mi da errore perchè dovrei specificare tutti i campi nel GROUP BY.
    L'unica soluzione credo che sia provare a sostituire gli asterischi con tutti i campi che mi servono e ripeterli di conseguenza nella clausola GROUP BY, giusto?

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Beh se lasci fuori dalla select il campo che varia ti basta aggiungere DISTINCT all'inizio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.