Update con valori diversi...

venerdì 28 marzo 2008 - 09.03

soprandi Profilo | Newbie

Ciao a tutti ho il seguente problema.
Devo fare una operazione di questo tipo: data una tabella libro contenente informazioni su dei libri e dato un campo di tale tabella, quantità, al momento vuoto, devo poter aggiornare tale campo nel seguente modo:

L1 > qta = 1
L2 > qta = 2
L3 > qta = 3
L4 > qta = 4
L5 > qta = 5
L6 > qta = 1
L7 > qta = 2
L8 > qta = 3
L9 > qta = 4
.... e cosi via...
La soluzione più banale che ho trovato è quella di ottenere tutti i libri dal db, scandire il risultato della query e per ogni libro eseguire un update del valore di quantità ottenuto ciclicamente nel programma. Confrontando l'ID dl libro quindi UPDATE libro SET qta=" +qta+" WHERE id = "+id+"

Questo però comporta una prima query di SELECT seguita da "n" query di update (una per libro).. poco efficiente dal punto di vista prestazionale...

nel caso avessi valorei identici la query migliore escluderebbe la prima select e mi permetterebbe di eseguire un update unico scorrendo la tabella

UPDATE tabella SET quantita = quantita+1

il mio problema sta nel fatto che la quantità differisce da libro a libro (o meglio ogni 5 libri il valore della quantità si ripete)... come posso fare a ridurrre il numero di query pur mantenendo il valore della quantità come quello indicato?

Spero di essermi spiegato..
grazie a tutti

ciao Simone

alx_81 Profilo | Guru

>Ciao a tutti ho il seguente problema.
Ciao e benvenuto su dotnethell!

>il mio problema sta nel fatto che la quantità differisce da libro
>a libro (o meglio ogni 5 libri il valore della quantità si ripete)...
>come posso fare a ridurrre il numero di query pur mantenendo
>il valore della quantità come quello indicato?
Quale DBMS Utilizzi?
Potresti postare le CREATE TABLE, qualche insert per provare e il risultato preciso che vuoi ottenere? Solo questo può aiutarci ad aiutarti
ciao!

Alx81 =)

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

soprandi Profilo | Newbie

Ciao puoi gentilmente dirmi come ottenre la create table a partire da una tabella ottenuta tramite l'upsize da access verso mssql? Io utilizzo il db tramite sql server managment studio express.
In ogni caso la tabella è piuttosto semplice ho un ID (auto incrementato) un titolo e la quantità...
Al primo passaggio creo i libri e non definisco una quantità precisa per ciascun libro
in un secondo momento voglio aggiungere il valore alla quantità senza però avere quantità tutte uguali tra loro (questo per rendere più verosimile la base di dati).

ora in ogni caso cerco di passarvi quello che vi serve

grazie

Simone

alx_81 Profilo | Guru

>Io utilizzo il db tramite sql server managment studio express.
>In ogni caso la tabella è piuttosto semplice ho un ID (auto incrementato)
>un titolo e la quantità...
Quindi alla fine tu hai tabelle su sql server. Access non c'entra più nulla.. Ora le hai su sql server. 2005?
Di conseguenza, dalla cartella Tables, seleziona una tabella col tasto destro --> Script table as --> Create to --> New Query Editor Window.

>Al primo passaggio creo i libri e non definisco una quantità
>precisa per ciascun libro
>in un secondo momento voglio aggiungere il valore alla quantità
>senza però avere quantità tutte uguali tra loro (questo per rendere
>più verosimile la base di dati).
passa le create, poi passami i dati che vuoi che io utilizzi per la prova ed infine il risultato che ti aspetti, ok?
Alx81 =)

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

soprandi Profilo | Newbie

Ok potevo anche aprire gli occhi e avrei visto come si faceva a trovare il codice per la create... cmq ho allegato nell'archivio, alcuni file sql generati da sql server 2005...

ci sono 3 create, create (crea la tab libro), createautore (crea la tab autore), create_Casa (crea la tab casa) tra le 3 ci sono vincogli di integrità. Ho anche messo 2 procedure T-SQL per popolare gli autori e la casa (popola_autori e popola_casa), l'ulitmo file o la inser sulla tabella libro (insert).

Penso di aver messo tutto il necessario.
Il file inser genera 10 o 11 libri ciascuno dei quali ha quantità = 0. Quello che vorrei ottenere io è, tramite un aggiornamento,la modifica del valore della quantità nel seguente modo.
Avendo 10 libri, a partire dal primo, aggiorno la quantità a 1, per il secondo a 2, per il terzo a 3, cosi via fino al quinto, dal sesto ricomincio il conteggio a partire dal valore 1.... Sembra una cosa scema ok ma è quello che mi serve... oggi ho provato con un po di T-SQL cercando di creare cicli opportuni ma con scarsi risultati.

grazie

Simone

alx_81 Profilo | Guru

>Ok potevo anche aprire gli occhi e avrei visto come si faceva
>a trovare il codice per la create... cmq ho allegato nell'archivio,
>alcuni file sql generati da sql server 2005...
, no problem, vanno benissimo.

Ho provato ad ottenere quello che ti serve con le CTE e le ranking functions:


USE tempdb; GO CREATE TABLE dbo.libro ( ID int IDENTITY(1,1) NOT NULL , titolo nvarchar(50) NULL , id_autore int NULL DEFAULT (0) , id_casa int NULL DEFAULT (0) , qta int NULL DEFAULT (0) , CONSTRAINT PK_libro PRIMARY KEY NONCLUSTERED ( ID ASC ) ) GO INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo1',1,1,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo2',1,2,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo3',1,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo4',1,1,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo5',1,2,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo6',1,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo1',2,1,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo2',2,2,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo3',2,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo4',2,1,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo5',2,2,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo6',2,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo1',3,1,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo2',3,2,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo3',3,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo4',3,4,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo5',3,5,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo6',3,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo7',3,4,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo8',3,5,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo9',3,3,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo0',3,4,0) INSERT INTO libro (titolo,id_autore,id_casa,qta) VALUES('Titolo1',3,5,0) GO -- tabella di appoggio per il numero di riga DECLARE @t TABLE (ID int, numeroriga int, titolo nvarchar(50)) INSERT INTO @t SELECT ID , numeroriga = (ROW_NUMBER() OVER (ORDER BY ID) - 1) , titolo FROM libro SELECT * FROM @t /* ID numeroriga titolo ----------- ----------- -------------- 1 0 Titolo1 2 1 Titolo2 3 2 Titolo3 4 3 Titolo4 5 4 Titolo5 6 5 Titolo6 7 6 Titolo1 8 7 Titolo2 9 8 Titolo3 10 9 Titolo4 11 10 Titolo5 12 11 Titolo6 13 12 Titolo1 14 13 Titolo2 15 14 Titolo3 16 15 Titolo4 17 16 Titolo5 18 17 Titolo6 19 18 Titolo7 20 19 Titolo8 21 20 Titolo9 22 21 Titolo0 23 22 Titolo1 */ -- ricavo i gruppi e trovo l'iteratore ;WITH GruppiLibri AS ( SELECT * , gruppo = numeroriga / 5 , conteggio = ROW_NUMBER() OVER (PARTITION BY numeroriga / 5 ORDER BY ID) FROM @t ) /* ID numeroriga titolo gruppo conteggio ----------- ----------- ----------- ----------- -------------------- 1 0 Titolo1 0 1 2 1 Titolo2 0 2 3 2 Titolo3 0 3 4 3 Titolo4 0 4 5 4 Titolo5 0 5 6 5 Titolo6 1 1 7 6 Titolo1 1 2 8 7 Titolo2 1 3 9 8 Titolo3 1 4 10 9 Titolo4 1 5 11 10 Titolo5 2 1 12 11 Titolo6 2 2 13 12 Titolo1 2 3 14 13 Titolo2 2 4 15 14 Titolo3 2 5 16 15 Titolo4 3 1 17 16 Titolo5 3 2 18 17 Titolo6 3 3 19 18 Titolo7 3 4 20 19 Titolo8 3 5 21 20 Titolo9 4 1 22 21 Titolo0 4 2 23 22 Titolo1 4 3 */ -- eseguo l'update per ID UPDATE L SET qta = GL.conteggio FROM libro L JOIN GruppiLibri GL ON L.ID = GL.ID GO SELECT * FROM libro /* ID titolo id_autore id_casa qta ----------- --------- ----------- ----------- ----------- 1 Titolo1 1 1 1 2 Titolo2 1 2 2 3 Titolo3 1 3 3 4 Titolo4 1 1 4 5 Titolo5 1 2 5 6 Titolo6 1 3 1 7 Titolo1 2 1 2 8 Titolo2 2 2 3 9 Titolo3 2 3 4 10 Titolo4 2 1 5 11 Titolo5 2 2 1 12 Titolo6 2 3 2 13 Titolo1 3 1 3 14 Titolo2 3 2 4 15 Titolo3 3 3 5 16 Titolo4 3 4 1 17 Titolo5 3 5 2 18 Titolo6 3 3 3 19 Titolo7 3 4 4 20 Titolo8 3 5 5 21 Titolo9 3 3 1 22 Titolo0 3 4 2 23 Titolo1 3 5 3 */ DROP TABLE libro GO

copia tutto il codice (tutto, perchè i nomi tabella sono uguali ai tuoi e in fondo ci sono le DROP TABLE ) e verrà lanciato su tempdb senza "rompere" il tuo db .
Spero sia quello che ti serve
>
>grazie
di nulla!

Alx81 =)

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

soprandi Profilo | Newbie

OTTIMO GRAZIE è proprio quello che mi serviva... ora lo studio nel caso chiederò delucidazioni...

grazie ancora

alx_81 Profilo | Guru

>OTTIMO GRAZIE è proprio quello che mi serviva... ora lo studio
>nel caso chiederò delucidazioni...
>
>grazie ancora
di nulla!

Alx81 =)

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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