Update prendendo i dati da un'altra tabella

giovedì 09 ottobre 2008 - 09.56

trinity Profilo | Guru

allora ho le seguenti tabelle:

Tabella Appoggio_mov

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


e la tabella Comuni:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

GO
SET ANSI_PADDING OFF


supponiamo che abbiamo i seguenti record:

Insert Into appoggio_mov(codalbergo,codcomalbergo,codnazione,comune,codcomune)Values('48','60035','0','Roma','0')
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



mentre nella tabella comuni abbiamo i seguenti dati:


Insert Into comuni(codcomune,comune)Values('58032','Roma') Insert Into comuni(codcomune,comune)Values('59032','Latina') Insert Into comuni(codcomune,comune)Values('54033','Palermo') Insert Into comuni(codcomune,comune)Values('66070','cagliari') Insert Into comuni(codcomune,comune)Values('60038','frosinone') Insert Into comuni(codcomune,comune)Values('57032','Terracina')


Allora io devo eseguire un'Update sulla tabella Appoggio_mov valorizzando il campo codcomune, prendendo questo codice dalla tabella comuni e tenendo presente
che l'update deve essere eseguita solo sui record che hanno codnazione=0.

Come posso fare?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Allora io devo eseguire un'Update sulla tabella Appoggio_mov
>valorizzando il campo codcomune, prendendo questo codice dalla
>tabella comuni e tenendo presente
>che l'update deve essere eseguita solo sui record che hanno codnazione=0.
>
>Come posso fare?

Così:

USE tempdb; CREATE TABLE dbo.Appoggio_mov( id bigint IDENTITY(1,1) NOT NULL, codalbergo int NULL, codcomalbergo int NULL, codnazione int NULL, comune varchar(250) NULL, codcomune int NULL CONSTRAINT PK_Appoggio_mov PRIMARY KEY(id) ); CREATE TABLE dbo.Comuni( id int IDENTITY(1,1) NOT NULL, codcomune int NULL, comune varchar(250) NULL CONSTRAINT PK_comuni PRIMARY KEY(id) ); INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Latina', 0); INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Terracina', 0); INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Palermo', 0); INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Cagliari', 0); INSERT dbo.Appoggio_mov VALUES(48, 60035, 5, NULL, 0); INSERT dbo.Appoggio_mov VALUES(48, 60035, 10, NULL, 0); INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Frosinone', 0); INSERT dbo.Comuni VALUES(58032, 'Roma'); INSERT dbo.Comuni VALUES(59032, 'Latina'); INSERT dbo.Comuni VALUES(54033, 'Palermo'); INSERT dbo.Comuni VALUES(66070, 'cagliari'); INSERT dbo.Comuni VALUES(60038, 'frosinone'); INSERT dbo.Comuni VALUES(57032, 'Terracina'); UPDATE A SET A.codcomune = C.codcomune FROM dbo.Appoggio_mov AS A JOIN dbo.Comuni AS C ON A.comune = C.comune WHERE A.codnazione = 0; SELECT * FROM dbo.Appoggio_mov; /* Output: id codalbergo codcomalbergo codnazione comune codcomune --- ----------- ------------- ----------- ----------- ----------- 1 48 60035 0 Latina 59032 2 48 60035 0 Terracina 57032 3 48 60035 0 Palermo 54033 4 48 60035 0 Cagliari 66070 5 48 60035 5 NULL 0 6 48 60035 10 NULL 0 7 48 60035 0 Frosinone 60038 (7 row(s) affected) */ DROP TABLE dbo.Appoggio_mov, dbo.Comuni;

Ora ti chiedo cortesemente di fermarti a confrontare il codice che hai postato con il mio... che differenze noti?
Ad esempio, perché i tuoi comandi di INSERT inseriscono SEMPRE stringhe nelle colonne numeriche obbligando SQL Server ad eseguire dei cast impliciti?
Perché TUTTE le tue colonne ad esclusione della PK ammettono il (non)valore NULL?

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

trinity Profilo | Guru

>>Allora io devo eseguire un'Update sulla tabella Appoggio_mov
>>valorizzando il campo codcomune, prendendo questo codice dalla
>>tabella comuni e tenendo presente
>>che l'update deve essere eseguita solo sui record che hanno codnazione=0.
>>
>>Come posso fare?
>
>Così:

Grazie mille

>
>USE tempdb;
>
>CREATE TABLE dbo.Appoggio_mov(
> id bigint IDENTITY(1,1) NOT NULL,
> codalbergo int NULL,
> codcomalbergo int NULL,
> codnazione int NULL,
> comune varchar(250) NULL,
> codcomune int NULL
> CONSTRAINT PK_Appoggio_mov PRIMARY KEY(id)
>);
>
>CREATE TABLE dbo.Comuni(
> id int IDENTITY(1,1) NOT NULL,
> codcomune int NULL,
> comune varchar(250) NULL
> CONSTRAINT PK_comuni PRIMARY KEY(id)
>);
>
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Latina', 0);
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Terracina', 0);
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Palermo', 0);
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Cagliari', 0);
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 5, NULL, 0);
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 10, NULL, 0);
>INSERT dbo.Appoggio_mov VALUES(48, 60035, 0, 'Frosinone', 0);
>
>INSERT dbo.Comuni VALUES(58032, 'Roma');
>INSERT dbo.Comuni VALUES(59032, 'Latina');
>INSERT dbo.Comuni VALUES(54033, 'Palermo');
>INSERT dbo.Comuni VALUES(66070, 'cagliari');
>INSERT dbo.Comuni VALUES(60038, 'frosinone');
>INSERT dbo.Comuni VALUES(57032, 'Terracina');
>
>UPDATE A
>SET A.codcomune = C.codcomune
>FROM dbo.Appoggio_mov AS A
>JOIN dbo.Comuni AS C
>ON A.comune = C.comune
>WHERE A.codnazione = 0;
>
>SELECT *
>FROM dbo.Appoggio_mov;
>
>/* Output:
>
>id codalbergo codcomalbergo codnazione comune codcomune
>--- ----------- ------------- ----------- ----------- -----------
>1 48 60035 0 Latina 59032
>2 48 60035 0 Terracina 57032
>3 48 60035 0 Palermo 54033
>4 48 60035 0 Cagliari 66070
>5 48 60035 5 NULL 0
>6 48 60035 10 NULL 0
>7 48 60035 0 Frosinone 60038
>
>(7 row(s) affected)
>
>*/
>
>DROP TABLE dbo.Appoggio_mov, dbo.Comuni;
>
>Ora ti chiedo cortesemente di fermarti a confrontare il codice
>che hai postato con il mio... che differenze noti?
>Ad esempio, perché i tuoi comandi di INSERT inseriscono SEMPRE
>stringhe nelle colonne numeriche obbligando SQL Server ad eseguire
>dei cast impliciti?

vero hai ragione, la prossima volta sarò molto + attento

>Perché TUTTE le tue colonne ad esclusione della PK ammettono
>il (non)valore NULL?

ci sono colonne di tipo testo che possono non avere dati pertanto setto che accettano il valore Null, sbaglio?

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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>ci sono colonne di tipo testo che possono non avere dati pertanto
>setto che accettano il valore Null, sbaglio?
Sbagli a fare in modo che TUTTE le colonne possano accettare il (non)valore NULL.
Devi adottare la strada opposta: definisco tutte le colonne come NOT NULL, e imposto a NULL SOLO quelle due o tre colonne che coerentemente con la logica applicativa possono rimanere non valorizzate.

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

trinity Profilo | Guru

Ho capito, grazie di nuovo ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
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