PDA

View Full Version : Query tra due tabelle clienti e ordini


Aleiovine86
01-12-2012, 18:32
Ragazzi ciao, sto creando un database con una tabella clienti e una tabella ordini, ho bisogno di creare una query che mi estragga tutti gli ordini di un determinato cliente, come posso fare?Ho le seguenti tabelle:

Clienti:Codice,Ragione_sociale,Fatt 2011,Fatt 2012,Località,Indirizzo,cod_ord(chiave esterna della tabella ordini)
Ordini:codice_ordine,Data_ordine,Descrizione,Totale_€


Sicuro di una vostra risposta vi ringrazio anticipatamente

AllerITA
02-12-2012, 07:10
Scusa hai fatto la normalizzazione del database?
Secondo me devi inserire una chiave per i clienti e tramite quella chiave devi associare le informazioni degli ordini che anch'essi avranno una chiave.
Con un tipo di relazione uno a molti.
Quindi dovrai cercare per ogni cliente i record ordini associati al cliente.
Almeno come la vedo io.:D

trottolino1970
02-12-2012, 07:19
Chiave prima nella anagrafica della tabella clienti è codice , chiave primaria nella tabella ordini è la coppia codice_ordine più codice cliente (che sarebbe chiave esterna per questa tabella ma chiave primaria nell'altra).
Fatto questo ,relazione uno a molti , puoi eseguire la query nella seconda tabella facendo anche un select nella prima per restituire il nome del cliente e non il codice con tutti i suoi ordini.


Sent from my iPhone using Tapatalk

The_ouroboros
02-12-2012, 10:41
Ragazzi ciao, sto creando un database con una tabella clienti e una tabella ordini, ho bisogno di creare una query che mi estragga tutti gli ordini di un determinato cliente, come posso fare?Ho le seguenti tabelle:

Clienti:Codice,Ragione_sociale,Fatt 2011,Fatt 2012,Località,Indirizzo,cod_ord(chiave esterna della tabella ordini)
Ordini:codice_ordine,Data_ordine,Descrizione,Totale_€


Sicuro di una vostra risposta vi ringrazio anticipatamente

Prova una cosa tipo:


SELECT
Codice || ' ,' || Ragione_sociale,
Fatt 2011,
Fatt 2012,
(Località || ',' || Indirizzo) AS Indirizzo,
to_char(cod_ord) || ' ' || (select Descrizione where codice_ordine = o.cod_ord ) AS Ordine_codice,
(select Data_ordine where codice_ordine = o.cod_ord ) AS Ordine_data,
(select Totale_€ where codice_ordine = o.cod_ord ) AS Ordine_totale
FROM Clienti o WHERE Codice = 'xxxx';

Aleiovine86
02-12-2012, 11:04
Secondo me ho bisogno di capire prima una cosa: quando inserisco un ordine come faccio a dire di quale cliente è?
Se capisco questo dopo è più facile creare la query...aspetto vostre risposte thanks

The_ouroboros
02-12-2012, 11:10
scrivi qui la query che hai in mente che poi ci lavoriamo sopra, ok?

Aleiovine86
02-12-2012, 11:22
Guarda sei gentilissimo grazie davvero, ma mi sn reso conto che devo capire prima bene come creare le tabelle per far si che quando inserisco un ordine devo anche dire per quale cliente è, siete d'accordo? Quindi come creare le tabelle?

idoido
02-12-2012, 11:41
consiglio semplice semplice:

un cliente può avere più ordini? SI
un ordine può appartenere a più clienti? NO

quindi relazione 1-N

tabella cliente: id_cliente, nome_cliente
tabella ordine: id_ordine, totale_ordine, cliente_id (questa è la chiave esterna)

per recuperare gli ordini di un cliente poi basterà fare

select * from ordine where cliente_id = 1

ndakota
02-12-2012, 12:15
Guarda sei gentilissimo grazie davvero, ma mi sn reso conto che devo capire prima bene come creare le tabelle per far si che quando inserisco un ordine devo anche dire per quale cliente è, siete d'accordo? Quindi come creare le tabelle?

Puoi immaginare per esempio che un tale cliente Pippo sia loggato a quest'applicazione e va sulla pagina per fare un ordine, dove tu avrai una variabile valorizzata con il nome di questo cliente. A questo punto quando invierà il nuovo ordine compilerai il nome del cliente con quello di quell'effettivo cliente che ha fatto l'ordine.

Chiaro che se vuoi fare una query direttamente su db, ti dovrai inventare tu chi diavolo ha fatto quest'ordine :D

Aleiovine86
02-12-2012, 12:22
Benissimo, quindi la tabella cliente dovrà avere anche un campo codice cliente ma non come chiave esterna?giusto? In modo tale che quando inserisco un ordine inserisco anche il suo codice... Fammi sapere

Aleiovine86
02-12-2012, 12:24
consiglio semplice semplice:

un cliente può avere più ordini? SI
un ordine può appartenere a più clienti? NO

quindi relazione 1-N

tabella cliente: id_cliente, nome_cliente
tabella ordine: id_ordine, totale_ordine, cliente_id (questa è la chiave esterna)

per recuperare gli ordini di un cliente poi basterà fare

select * from ordine where cliente_id = 1
Grandissimo, finisco di vedere la partita e provo subito... Thanks

ndakota
02-12-2012, 12:25
Come già ti han detto avrai una tabella clienti con una chiave primaria che identificherà ogni cliente. E una tabella ordini con una chiave primaria composta da codice_ordine e codice_cliente, che insieme identificheranno ogni ordine.

Ora che ci penso la chiave della tabella ordini potrebbe anche essere solo il codice dell'ordine. Non son più così fresco di basi di dati per capire cosa ciò comporti però. Di sicuro qualche differenza c'è.

Aleiovine86
02-12-2012, 15:59
Perfetto ragazzi ora è tutto a posto grazie a voi..ora apro un'altra discussione perchè devo chiedervi un'altra cosa ;)

trottolino1970
02-12-2012, 16:06
Solitamente la relazione uno a molti si scindi interponendo una nuova tabella intermedia, quindi si avrebbe una tabella cliente contenente un id_cliente come chiave primaria e tutti gli altri campi, un tabella contenente id_cliente ed id_ordine (entrambi chiavi) ed infine una tabella ordini contenente id_ordine come chiave primaria e poi tutti gli altri campi.


Sent from my iPhone using Tapatalk

The_ouroboros
02-12-2012, 17:10
Solitamente la relazione uno a molti si scindi interponendo una nuova tabella intermedia, quindi si avrebbe una tabella cliente contenente un id_cliente come chiave primaria e tutti gli altri campi, un tabella contenente id_cliente ed id_ordine (entrambi chiavi) ed infine una tabella ordini contenente id_ordine come chiave primaria e poi tutti gli altri campi.


Sent from my iPhone using Tapatalk

In effetti, anche x lavoro ho sempre visto fare così..

Inviato dal mio HUAWEI U8825-1 con Tapatalk 2

trottolino1970
02-12-2012, 17:14
In effetti, anche x lavoro ho sempre visto fare così..

Inviato dal mio HUAWEI U8825-1 con Tapatalk 2

eh perchè cosi si fa ;)

The_ouroboros
02-12-2012, 17:46
eh perchè cosi si fa ;)

Grazie cmq x per avere chiarito.
Essendo uno che impara "as I go" fa piacere a volte avere conferme :)

Inviato dal mio HUAWEI U8825-1 con Tapatalk 2

trottolino1970
02-12-2012, 17:51
Grazie cmq x per avere chiarito.
Essendo uno che impara "as I go" fa piacere a volte avere conferme :)

Inviato dal mio HUAWEI U8825-1 con Tapatalk 2

Prego


Sent from my iPhone using Tapatalk

idoido
02-12-2012, 18:19
Solitamente la relazione uno a molti si scindi interponendo una nuova tabella intermedia, quindi si avrebbe una tabella cliente contenente un id_cliente come chiave primaria e tutti gli altri campi, un tabella contenente id_cliente ed id_ordine (entrambi chiavi) ed infine una tabella ordini contenente id_ordine come chiave primaria e poi tutti gli altri campi.


Sent from my iPhone using Tapatalk

se non sapete progettare un db, non scrivete che fate una figura migliore.
da che mondo e mondo per una relazione 1 a molti bisogna creare una tabella intermedia? basta una chiave esterna.

una tabella intermedia contenente la coppia delle chiavi primarie va fatta in una relazione molti a molti, come ad esempio ordine-prodotto

trottolino1970
02-12-2012, 18:21
se non sapete progettare un db, non scrivete che fate una figura migliore.
da che mondo e mondo per una relazione 1 a molti bisogna creare una tabella intermedia? basta una chiave esterna.

una tabella intermedia contenente la coppia delle chiavi primarie va fatta in una relazione molti a molti, come ad esempio ordine-prodotto

è arrivato il maestro applausiiiiiiiiiiiiiiiiiiiiiiiiiiii :muro: :muro: :muro:

idoido
02-12-2012, 18:24
è arrivato il maestro applausiiiiiiiiiiiiiiiiiiiiiiiiiiii :muro: :muro: :muro:

visto che sei tu il maestro, mi spieghi a cosa serve creare una tabella intermedia come l'hai descritta tu in una relazione uno a molti?
son curioso di sentire la spiegazione

trottolino1970
02-12-2012, 18:31
visto che sei tu il maestro, mi spieghi a cosa serve creare una tabella intermedia come l'hai descritta tu in una relazione uno a molti?
son curioso di sentire la spiegazione

prendi un libro di base di dati e te lo leggi.
poi ne prendi uno sul costo delle query e lo leggi, visto che sei prof li dovresti già avere queste cose

idoido
02-12-2012, 18:37
prendi un libro di base di dati e te lo leggi.
poi ne prendi uno sul costo delle query e lo leggi, visto che sei prof li dovresti già avere queste cose

bene facciamo come dici tu:
tabella clienti: id_cliente, nome_cliente
tabella ordini: id_ordine, totale_ordine
tabella relazione: cliente_id, ordine_id

come hai strutturato tu, per recuperare tutti gli ordini di un determinato cliente dovresti fare questa query:

select * from ordini inner join relazione on ordini.id_ordine = relazione.ordine_id where relazione.cliente_id=1

ora spiegami perché il costo di questa query dovrebbe essere inferiore a quella che ho scritto precedentemente del post, cioè questa:

select * from ordine where cliente_id = 1

trottolino1970
02-12-2012, 18:43
bene facciamo come dici tu:
tabella clienti: id_cliente, nome_cliente
tabella ordini: id_ordine, totale_ordine
tabella relazione: cliente_id, ordine_id

come hai strutturato tu, per recuperare tutti gli ordini di un determinato cliente dovresti fare questa query:

select * from ordini inner join relazione on ordini.id_ordine = relazione.ordine_id where relazione.cliente_id=1

ora spiegami perché il costo di questa query dovrebbe essere inferiore a quella che ho scritto precedentemente del post, cioè questa:

select * from ordine where cliente_id = 1

le * nelle query non si usano

The_ouroboros
02-12-2012, 19:10
le * nelle query non si usano

immagino sia per motivi di ottimizzazione e prestazionali, ma.... argomenteresti più in dettaglio questa affermazione? :)

trottolino1970
02-12-2012, 19:13
immagino sia per motivi di ottimizzazione e prestazionali, ma.... argomenteresti più in dettaglio questa affermazione? :)

esatto . Dimmi cosa vuoi sapere

The_ouroboros
02-12-2012, 19:18
esatto . Dimmi cosa vuoi sapere

il costo di usare un (select campo from tabella where <cond>) as Qualcosa come campo di una select. [vedi la query mia a inizio 3d]
Se può essere utile lavoro su db Oracle 9.0.2

trottolino1970
02-12-2012, 19:37
il costo di usare un (select campo from tabella where <cond>) as Qualcosa come campo di una select. [vedi la query mia a inizio 3d]
Se può essere utile lavoro su db Oracle 9.0.2

esattamente ma selezionare tutti i campi di una tabella che potrebbe contenere migliaia di record aumenta il costo (tempo cpu ram etc etc ) della query.

The_ouroboros
02-12-2012, 19:41
esattamente ma selezionare tutti i campi di una tabella che potrebbe contenere migliaia di record aumenta il costo (tempo cpu ram etc etc ) della query.


diciamo che ho che fare con tabelle da 15/20 milioni (le piu piccole sui 13.000) di record all'incirca.
Sto cercando modi di ridurre il tempo di attesa di risoluzione della query( diciamo che in alcuni casi si arriva ai 5/6 secondi)

trottolino1970
02-12-2012, 19:45
diciamo che ho che fare con tabelle da 15/20 milioni (le piu piccole sui 13.000) di record all'incirca.
Sto cercando modi di ridurre il tempo di attesa di risoluzione della query( diciamo che in alcuni casi si arriva ai 5/6 secondi)

Eh per poterti aiutare mi servono informazioni più precise. Come sono strutturate le tabelle ed almeno una parte del db almeno questo. È indicizzato ?


Sent from my iPhone using Tapatalk

gugoXX
03-12-2012, 10:47
Non c'e' nulla di male nella prima o nella seconda.
La differenza e' nel tipo di organizzazione che si vuole dare al DB.
Prima forma normale
Seconda forma normale
Terza forma normale
e forma normale di boyce codd

Studiatevi le forme normali (se vi interessa), i pregi, i difetti e saprete quando applicarle a seconda del problema al contorno e delle domande che volete porre al DB