Newsgroup: it.comp.software.database
Titolo: Problema in una query

Premetto che i campi che iniziano con id sono tutti chiavi primarie.
Ho due tabelle:
- Tabella UNO con i campi 'id_uno' 'nome'
- Tabella DUE con i campi 'id_due' 'nome'
Poi ho una tabella che lega le due (risolvo una relazione molti a
molti):
- Tebella TRE con i campi 'id_uno' 'id_due'
Devo inserire nella tabella UNO il nome 'Nuovo', e devo legarla alla
tabella DUE dove 'id_due' è uguale a '1'.
Per fare questo faccio la query:
INSERT INTO uno (id_uno,nome) VALUES ('','Nuovo')
Ovvero inserisco la tupla lasciando al DBMS l'inserimento automatico
della chiave primaria id_uno.
Il problema è questo: come faccio a sapere che valore ha dato il DBMS
ad id_uno per poi fare questa query:
INSERT INTO tre (id_uno,id_due) VALUES ('????????','1')
Grazie!
--
Marco "Duff" Palermo
http://www.marcoduff.com/

 INSERT INTO tre (id_uno,id_due) VALUES ('????????','1')
INSERT INTO tre (id_uno,id_due) SELECT '????????',id_uno from uno where
nome='Nuovo'
sempre che tu abbia una unica tupla con nome='Nuovo'; altrimenti cercati un
metodo per distinguere il valore che ti interessa in modo univoco... forse
max(id_uno) ?
Paulus
--------------------------------
Inviato via 
http://usenet.libero.it

nome='Nuovo'
Scusami, ma non mi è chiara la query che hai scritto...
Che cosa dovrei metterci al posto dei ?


 Che cosa dovrei metterci al posto dei ?
Scusa, forse non ho capito bene prima... se al posto di '???????' tu volevi
il valore di id_uno, allora devi fare:
INSERT INTO tre (id_uno,id_due) SELECT id_uno,'1' from uno where
nome='Nuovo'
Mi avevano confuso gli apici...
Paulus

Mi avevano confuso gli apici...
Forse mi sono spiegato male...
Faccio un altro esempio:
Ho una tabella di nome TAB, con due campi: "id" e "nome".
Voglio inserire un elemento, scrivo la query:
INSERT INTO tab (id,nome) VALUES ('','prova')
Come vedi non specifico il valore per id, lo faccio inserire
direttamente dal DBMS in uso, ma se in una query successiva io dovessi
usare l'id che ha inserito automaticamente il DBMS  come dovrei fare?
Spero di essermi spiegatoi meglio.


 
http://www.marcoduff.com/
OK, alt, fermi tutti, ricominciamo da capo:
Hai due possibilità (cioè mi vengono in mente due possibilità):
1) usare la variabile globale @@identity, che ti ritorna l'ultimo valore
generato da un campo tipo identità (es. contatore).
Questa variabile è a livello di sessione, perciò se nella stessa sessione
fai più inserimenti di campi identity, dovresti ricuperare il valore e
memorizzarlo in una variabile dopo ogni inserimento.
Se invece ti interessa l'ultimo valore generato a livello di tabella, hai la
funzione ident-current('nometabella').
Se invece questo lo fai dentro a una stored procedure, dovresti usare
scope_identity() per assicurarti che ti dia l'ultima identity generata
NELL'ESECUZIONE DI QUELLA STORED PROCEDURE.
Come vedi, le possibilità sono diverse, dovresti un po' valutare te quale
usare e fare un po' di prove...
2) in qualche modo riesci ad individuare la tupla con i dati che hai
inserito (per es, se io so per sicuro che in ogni riga inserisco un dato,
posso ricuperare l'id "where ...."), e questo sarebbe quello che ho tentato
di dirti nei miei precedenti post.
Detto tra noi, Oracle ha le sequenze e puoi usare .nextval e .curval, e
secondo me il suo uso e funzionamento è molto più logico...
