>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