Newsgroup: it.comp.lang.delphi
Titolo: Difficolta' su una query

Ciao a tutti,
  premetto che mi trovo ad interrogare un database (firebird) progettato da 
terzi e che, giornalmente, si popola.
La mia interrogazione al db ha la finalita' di estrarre dei dati che, le 
mille procedurre/funzioni, il gestionale non fa.
 
Ed e' sulla crezione della query, che interessa due tabelle, che ho dei 
problemi.
In sintesi la prima tabella registra l'header (se cosi' si puo' definire) 
dell'operazione, la seconda il dettaglio.
La prima tabella ha in comune con la seconda un campo (IdOperazione) con il 
quale imposto la query.
Mentre nella prima tabella il campo IdOperazione e' un numero (integer) 
univoco, nella seconda non lo e', quindi potrebbe ripetersi perche' sul quel 
riferimento si sono fatte piu' operazioni.
Cerco di spiegarmi meglio con un esempio
 
Prima tabella
IdOperazione 28 (e' legata ad 1 operazione)
IdOperazione 29 (e' legata a 3 operazioni)
IdOperazione 30 (e' legata a 2 operazioni)
IdOperazione31 (e' legata ad 1 operazione)
....
 
Seconda tabella
IdOperazione 28
IdOperazione 29
IdOperazione 29
IdOperazione 29
IdOperazione 30
IdOperazione 30
IdOperazione 31
 
La query che imposto e'
 
Select * From Tabella1 Inner Join Tabella2  on 
Tabella1.IdOperazione=Tabella2.IdOperazione where Tabella1.Data='2016/11/05'
 
Con questa query mi vengono restituite tutte le righe, comprrese le doppie.
 
Come posso fare per estrarre, dalla seconda tabella, solo gli IdOperazioni 
diversi ? ovvero 28,29,30,e 31 solo 1 volta?
 
Al momento estraggo tutto, poi passo riga per riga e se l'idoperazione che 
leggo e' uguale a quello precedente lo salto.
 
E' possibile farlo?
 
Grazie
 
Ciao
Daniele 
 

Ciao Daniele , a quanto ne so dalla tua query mi sarei aspettato esattamente 
i risultati che ottieni. Come sai dalle domande che pongo, sono tutt'altro 
che esperto, ma provo a darti un paio di suggerimenti (ma io uso il BDE e 
quindi LocalSql).
Potresti provare con questa select;
 
select * from PrimaTabella where IDOperazione in (select distinct 
IDOperazione from SecondaTabella)
 
oppure con un trucco continuare a usare la tua inner join, se hai un campo 
da sommarizzare:
 
select IDOperazione, sum(importo) from PrimaTabella inner join 
SecondaTabella on IDOperazione=SecondaTabella.IDOperazione group by 
IDOperazione 
 

 diversi ? ovvero 28,29,30,e 31 solo 1 volta?
[...]
 
ciao
 
Ti rispondo ugualmente anche se la tua e' una domanda un po' OT per questo gruppo (cosa c'entra delphi con questo problema esclusivamente di DB?) 
 
Se questa query viene utilizzata solo dalla tua procedura, perche' non 
ti limiti ad un "Select * From Tabella1" ? Cosi' ogni idOperazione ti
compare una sola volta... :-o
 
ciao
Giacomo
 
 
 
 
 


 
non ti è chiaro il concetto logico della relazione master-detail.
Il senso della relazione è di "uno a molti", cioè per ogni elemento 
(idoperazione) dalla tabella master, nella detail puoi avere più righe, 
che corrispondono ad una sola riga nel master.
 
Se vuoi tutte le idoperazioni senza duplicati le trovi già, per 
definizione, nella tabella master:
 
Select IdOperazione From Tabella1 where Tabella1.Data='2016/11/05'
 
-- 
Morde

 E' possibile farlo?
 
Non e` una domanda che ha molto senso. Se vuoi estrarre gli id univoci delle operazioni, lo fai sulla tabella master. Se, invece, vuoi estrarre l'id dalla tabella master e il primo record sulla tabellla figlia, con quella foreign key, dal momento che la selezione del record detail sarebbe random, non vedo che senso abbia fare una cosa del genere. Forse faresti bene a descrivere qual e` la tua esigenza, senza entrare nello specifico della tua soluzione.
In sostanza: perche` ti serve fare una cosa del genere?
 
 

 compare una sola volta... :-o
In effetti, leggendo le altre risposte, mi sono reso conto che ho impostato 
malissimo il quesito.
Il numero delle operazioni e' gia' restituito dalla tabella principale, il 
problema di query e' sulla seconda.
 
Sebbene non sia un problema di delphi, e per non lasciare niente in sospeso, 
il problema e' sulla seconda query
dove ho un IdOperazione2 nella seconda tabella.
La domanda corretta era su come eliminare dalla query i valori doppi di 
IdOperazione2.
 
Ho risolto alla vecchia maniera!
 
Ciao e grazie
 
Daniele
 
 
 
 

Ciao a tutti !!
 
Grazie a tutti per le risposte !
In effetti la domanda era, oltre a non centrare niente con delphi, 
completamente errata.
 
Mi scuso per avervi fatto perdere del tempo prezioso, credo che nel 
labirinto mentale per evitare due procedure (fare tutto in una volta) sia 
stato fatale per indurmi in questa .... non troppo bella figura.
 
Scusare ancora.
 
Ciao
 
Daniele