Il linguaggio di programmazione Delphi
 

Difficolta' su una query

Daniele 24 Nov 2016 10:25
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
Stark 24 Nov 2016 12:35
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
Giacomo Degli Esposti 24 Nov 2016 12:40
On Thursday, November 24, 2016 at 10:25:30 AM UTC+1, Daniele wrote:
[...]
> 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?
[...]

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
Morde 24 Nov 2016 14:57
On 24.11.2016 10:25, Daniele wrote:

> Come posso fare per estrarre, dalla seconda tabella, solo gli
> IdOperazioni diversi ? ovvero 28,29,30,e 31 solo 1 volta?
>

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
4ndre4 24 Nov 2016 16:01
On Thursday, 24 November 2016 09:25:30 UTC, Daniele wrote:

[...]
> 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?
Daniele 25 Nov 2016 10:03
Ciao Giacomo,

> 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?)
Vero ... non sono stato attento !!

> 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
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
Daniele 25 Nov 2016 10:07
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

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.