SQL: inserimento di N record

giovedì 24 settembre 2009 - 12.02

the_driver Profilo | Senior Member

Ciao a tutti, ho questo problema:

ho una tabelle UTENTI in cui la chiave primaria è USR_COD,numerica.

ho una tabella VALORI che mi restituisce i seguenti valori: a,b,c,d,e,f (varchar(1))

Dovrei fare un inserimento in una terza tabella chiamata UTENTI_VALORI,(che ha 2 campi, FK_USR_COD (int) e FK_VALORE(varchar(1))) per ogni utente USR_COD devo inserire N righe per ogni VALORE letto:

esempio

usr_cod letti: 1,2,3,4 e 5
valori letti: a,b,c,d,e,f

inserimento finale:

1 a
1 b
1 c
1 d
1 e
...
5 f

Come posso fare?

Pensavo ai cursori, ma sicuramente si può risolvere diversamente. Grazie mille!

alx_81 Profilo | Guru

>Ciao a tutti, ho questo problema:
Ciao

>Pensavo ai cursori, ma sicuramente si può risolvere diversamente.
No, non pensarci quasi mai , anche mai se riesci

Indipendentemente da questo, le due tabelle "sorgenti" sono già popolate? se le metti in join ottieni quel che ti serve?
Se sì, puoi fare una INSERT SELECT.

>Grazie mille!
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Dovrei fare un inserimento in una terza tabella chiamata UTENTI_VALORI,(che
>ha 2 campi, FK_USR_COD (int) e FK_VALORE(varchar(1))) per ogni
>utente USR_COD devo inserire N righe per ogni VALORE letto:

Questo è uno dei rari casi dove i prodotti cartesiani sono utili (e desiderati!)
Tramite l'operatore CROSS JOIN potrai risolvere elegantemente il problema:

USE tempdb; CREATE TABLE dbo.Utenti( usr_cod int NOT NULL PRIMARY KEY ); CREATE TABLE dbo.Valori( valore char(1) NOT NULL PRIMARY KEY ); CREATE TABLE dbo.UtentiValori( usr_cod int NOT NULL, valore char(1) NOT NULL, CONSTRAINT PK_UtentiValori PRIMARY KEY(usr_cod, valore), CONSTRAINT FK_UtentiValori_Utenti FOREIGN KEY(usr_cod) REFERENCES dbo.Utenti(usr_cod), CONSTRAINT FK_UtentiValori_Valori FOREIGN KEY(valore) REFERENCES dbo.Valori(valore) ); INSERT dbo.Utenti VALUES (1), (2), (3), (4), (5); INSERT dbo.Valori VALUES ('a'), ('b'), ('c'), ('d'), ('e'), ('f'); INSERT dbo.UtentiValori SELECT usr_cod, valore FROM dbo.Utenti CROSS JOIN dbo.Valori; SELECT * FROM dbo.UtentiValori; /* Output usr_cod valore ----------- ------ 1 a 1 b 1 c 1 d 1 e 1 f 2 a 2 b 2 c 2 d 2 e 2 f 3 a 3 b 3 c 3 d 3 e 3 f 4 a 4 b 4 c 4 d 4 e 4 f 5 a 5 b 5 c 5 d 5 e 5 f (30 row(s) affected) */ DROP TABLE dbo.UtentiValori, dbo.Utenti, dbo.Valori;

Per ulteriori informazioni consulta i seguenti paragrafi dei Books Online:
http://msdn.microsoft.com/en-us/library/ms187628.aspx
http://msdn.microsoft.com/en-us/library/ms190690.aspx

>Grazie mille!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

the_driver Profilo | Senior Member

le tabelle sono già popolate ma non hanno la possibilità di essere relazionate. Sarà la tabella che verrà costruita che sarà utilizzata per relazionarle.

lbenaglia Profilo | Guru

>le tabelle sono già popolate ma non hanno la possibilità di essere
>relazionate. Sarà la tabella che verrà costruita che sarà utilizzata
>per relazionarle.
Quindi?
I constraint di FK si applicano solo alla nuova tabella (quella dalla parte molti della relationship) e, volendo, non sono nemmeno necessari ai fini del suo popolamento (anche se andrebbero implementati per garantire una consistenza logica della base dati).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5