Pagina 1 di 1

SQLite e ottimizzazione query

Inviato: mer mar 10, 2010 16:13
da lennynero
Ciao a tutti, vorrei esporre un piccolo dubbio/richiesta su come simulare una full join su sqlite o riuscire a ottimizzare la mia query.
In sostanza la query che ho scritto è piuttosto complessa e serve per effettuare delle statistiche su dei dati, in sintesi fa questo:
somma i pasti per un cliente in una data, somma gli scarichi di magazzino per quel cliente in quella data e mette in relazione le 2 quantità

La relazione tra le 2 "viste" può essere vuota da un lato, quindi il mio approccio è il seguente:
Ho una query che mi calcola i pasti P, e una che mi calcola gli scarichi S, così lo pseudocodice diventa:

Codice: Seleziona tutto

select * from P left join S on P.cliente=S.cliente and P.data=S.data union
select * from S left join P on P.cliente=S.cliente and P.data=S.data


Il mio problema sostanzialmente sta nel fatto che le query P e S sono piuttosto complesse e mi scoccia doverle eseguire 2 volte per ottenere il risultato voluto.
Un modo per ottimizzare la query è appunto una full join scritta così:

Codice: Seleziona tutto

select * from P inner join S on P.cliente=S.cliente and P.data=S.data

ma so che questo non è possibile(in sqlite), quindi chiedo a voi come potrei ottimizzare questa query per ridurre il tempo di calcolo. Grazie in anticipo.

Re: SQLite e ottimizzazione query

Inviato: mer mar 10, 2010 19:38
da alexxxius
Ciao non conosco sqLite, ma un modo per fare la full join senza il costrutto join e quello di fare la theta join (se no sbaglio si dice così) usando il where:

Codice: Seleziona tutto

select * from P,S where P.cliente=S.cliente and P.data=S.data


ciao

Re: SQLite e ottimizzazione query

Inviato: gio mar 11, 2010 4:03
da lennynero
Grazie per la risposta alexxxius, solo che a me non interessa il theta join poichè quello serve per prendere solo le righe di P e S che matchano le clausole, a me interessa un full join o un workaround per prendere sia le tuple che matchano le clausole sia quelle che da un lato hanno il join vuoto, per intenderci un letf join + un right join con distinct. In ogni caso per adesso mi accontento di creare una tabella temporanea con la query in esame, l'unico inconveniente è che per creare la tabella comunque impiegherò un pò di tempo(sto parlando di 15secondi circa), inoltre devo prevedere un trigger che nel caso di aggiunte/modifiche di pasti o scarichi deve ricreare la table...Non mi soddisfa molto questa soluzione, poichè ad ogni modifica potrei dover aggiornare la table, oppure dovrei scegliere di creare ad ogni prima richiesta di quei dati. Preciso inoltre che quei dati saranno poi ulteriormente filtrati con dei where per facilitarne la navigazione ma a quel punto il + sarebbe fatto... Attendo altri consigli. Grazie.