Newsgroup: it.comp.www.php
Titolo: SQL - eseguire più operazioni

Come faccio a far eseguire a una query SQL piu' operazioni? Devo fare una query
di questo tipo
SELECT X FROM Y WHERE K=H
UPDATE X SET M=I
UPDATE X SET N=J
la quale faccia prima un select e poi in base ai dati ottenuti faccia degli update.
Bisogna per caso utilizzare il comando GO, oppure BEGIN END?
Grazie
Messaggio spedito dal sito Risorse.net
La comunita' virtuale di Web masters e Web designers
http://www.risorse.net



UPDATE X SET N=J
Ma sono slegate come query o sbaglio?
-- 
ciaoz
Ho talmente fame che il mio stomaco fa tutt'uno con la spina dorsale
--
Michel <ZioBudda> Morelli               
mic...@ziobudda.net
ICQ UIN: 58351764                       PR of Linux in Italy
http://www.ziobudda.net
 
http://www.linuxlab.it
 

 
Spero di intrepretare bene:
UPDATE X SET M=I, N=J WHERE K=H
aggiorni i campi m,n ai valori i,j delle righe di x per cui il valore
dell'attrributo k e' uguale ad h.
	FRANK

Il fatto è che non so come fargli eseguire due operazioni distinte, una di select
e una di update. Se dovessi aggregarle allora saprei come fare (UPDATE ... WHERE
X=(SELECT ...)), ma io volgio mantenerle distinte.

Messaggio spedito dal sito Risorse.net


UPDATE X SET M=I
Nella prima query usi X come un attributo, nella seconda come tabella. E
questo non e' permesso (cioe', e' permesso, ma succedono cose diverse da
quello che pensi tu).
Quello che vuoi fare tu e'
	UPDATE Y SET M=I,N=J WHERE K=H;
oppure forse
	SELECT X FROM Y WHERE K=H;
	UPDATE Y SET M=I,N=J WHERE K=H;
Altrimenti, ti serve un campo identificativo (handle od OID) di Y, per
cui abbia senso scrivere:
	SELECT oid AS hnd INTO TEMP_Y FROM Y WHERE K=H;
	UPDATE Y SET M=I,N=J FROM Y,TEMP_Y WHERE Y.oid=TEMP_Y.hnd;
Leonardo
-- 
".signature": bad command or file name

 
Immagino (visto il NG) che tu voglia lavorare sul risultato della select
prima di effettuare l'update.
Se i campi che tiri fuori dalla prima select non sono molti puoi
metterli in un array bidimensionale (sempre che anche le righe che
estrai non siano molte...).
Con che dbms lavori?
Questo e' importante! Se tu lavorassi con postgres o Interbase potresti
implementare una stored procedure per risolvere il tuo problema sul
server, mentre con mysql devi smazartela con il codice o strutturando
meglio la query, magari adeguando le tue esigenze alla query stessa
(della serie, se l'esperimento non riesce, adeguo il risultato..)
Rigurdando la tua sequenza:
SELECT X FROM Y WHERE K=H
 UPDATE X SET M=I
 UPDATE X SET N=J
Mi sono reso conto che nella select X e'un attributo, mentre nelle
update e' una tabella. Svista?
	FRANK
PS: per favore, risposte solo sul NG, grazie

 Grazie
Sintassi 'Select':
SELECT campo1[, campo2,...campoN] FROM tuatabella WHERE condizioni;
Sintassi 'Update' (N.B.: varia a seconda dell'implementazione):
UPDATE tuatabella SET campo1=valore1[, campo2=valore2, ..., campoN=valoreN]
WHERE condizioni;
Ciò pone il problema di cosa rappresenti la X dei tuoi 'update'.
Se rappresenta il 'risultato' della 'select' sopra scritta, allora leggo la
tua domanda più o meno in questo modo:
"Come faccio a trattare una query di selezione come se fosse una tabella, se
questa non possiede un 'nome'?
e in particolare come posso fare un aggiornamento sul risultato di quella
query?"
In questo caso potrei rispondere:
- fregatene di fare la 'select' e filtra la tua tabella per mezzo della
clausola where di update.
oppure
- crea una 'tabella virtuale' con l'istruzione "CREATE VIEW nomeview AS
SELECT ... ecc. ....;"
In questo modo disponi di un 'nome' [e non mi pare poco!]
Purtroppo in proposito non so dirti molto di più, quindi mi limito ad
invitare tutti ad un approfondimento e ad 'assemblare' le diverse conoscenze
ed esperienze.
Se invece la tua X è in realtà una Y (distrazione!), allora mi pare che le
tre istruzioni siano indipendenti e la tua domanda non sembra avere un
senso. Infatti basta eseguire le tre istruzioni avendo la bontà di
aggiungere anche alle query di aggiornamento la medesima clausola where
posta in quella di selezione.
SELECT X FROM Y WHERE K=H
UPDATE Y SET M=I, N=J WHERE K=H
Oppure il tuo è un problema di 'transazioni'?
Insomma fra la 'distrazione', l'assenza di un esempio chiarificatore e altre
informazioni utili (ad esempio il db che usi) risulta davvero difficile
comprendere quale sia il problema.
dickie

Voglio che SQL restituisca alla pagina asp che lo fa eseguire un valore(@PIPPO)
dopo aver eseguito 3 operazioni di update da esso condizionate. Per questo pensavo
a una struttura di questo tipo:
DECLARE @PIPPO int
SELECT @PIPPO=(SELECT A FROM B WHERE C=D)
UPDATE TABELLA1 SET E=F WHERE G=@PIPPO
UPDATE TABELLA2 SET H=I WHERE L=@PIPPO
UPDATE TABELLA3 SET M=N WHERE O=@PIPPO
PRINT @PIPPO
Voglio che il valore di @PIPPO venga rimandato alla pagina ASP per poter sapere
su che linee delle 3 tabelle è stato effettuatol'update.
PROBLEMA 1:
uso MS SQL 7 (ma per motivi di licenza credo passero' presto a mysql) e non so
se è corretto scrivere le operazioni (ovviamente nella stessa query) senza dividerle
da puntievirgola.
PROBLEMA 2:
UNA SCRITTURA DI QUESTO TIPO SEMBRA FUNZIONARE, PERCHE' GLI UPDATEAVVENGONO REALMENTE,
MA "PRINT @PIPPO" NON FUNZIONA E NON RIESCOMAI A CAPIRE DOVE AVVENGONO TALI UPDATE,
cosa che sarebbe utile...
Grazie dell'aiuto


Voglio che SQL restituisca alla pagina asp che lo fa eseguire un valore(@PIPPO)
dopo aver eseguito 3 operazioni di update da esso condizionate. Per questo pensavo
a una struttura di questo tipo:
DECLARE @PIPPO int
SELECT @PIPPO=(SELECT A FROM B WHERE C=D)
UPDATE TABELLA1 SET E=F WHERE G=@PIPPO
UPDATE TABELLA2 SET H=I WHERE L=@PIPPO
UPDATE TABELLA3 SET M=N WHERE O=@PIPPO
PRINT @PIPPO
Voglio che il valore di @PIPPO venga rimandato alla pagina ASP per poter sapere
su che linee delle 3 tabelle è stato effettuatol'update.
PROBLEMA 1:
uso MS SQL 7 (ma per motivi di licenza credo passero' presto a mysql) e non
so
se è corretto scrivere le operazioni (ovviamente nella stessa query) senza dividerle
da puntievirgola.
PROBLEMA 2:
UNA SCRITTURA DI QUESTO TIPO SEMBRA FUNZIONARE, PERCHE' GLI UPDATEAVVENGONO
REALMENTE,
MA "PRINT @PIPPO" NON FUNZIONA E NON RIESCOMAI A CAPIRE DOVE AVVENGONO TALI
UPDATE,
cosa che sarebbe utile...
Grazie dell'aiuto


 
Scusa, ma se usi asp, xche' fai le domande qui? Questo e' il ng di
php...
Io non so nulla di asp....
Sono pero' certo che print in Sql non esiste, quindi devo dedurre che e'
una iscruzione proprietaria di M$SQL, non ti consiglio di usare roba non
standard xche' in una eventuale migrazione avrai dei grossi casini!!!!
		FRANK

su che linee delle 3 tabelle è stato effettuatol'update.
Allora e' semplicissimo. In MySQL, per esempio, fai una SELECT recno
FROM, leggi il risultato in $modified[], e poi fai gli UPDATE.
A quel punto, $modified[0] e' il recno della prima riga modificata e
cosi' via.


Mi potresti fare un favore? Mi tradurresti in "pratica" sul mio script quello
che mi hai suggerito? Non ho idea di cosa sia UNA RECNO,una variabile con $ ed
il significato delle [].
DECLARE @PIPPO int
SELECT @PIPPO=(SELECT A FROM B WHERE C=D)
UPDATE TABELLA1 SET E=F WHERE G=@PIPPO
UPDATE TABELLA2 SET H=I WHERE L=@PIPPO
UPDATE TABELLA3 SET M=N WHERE O=@PIPPO
PRINT @PIPPO
Oppure credo mi basterebbe un'indicazione su dove posso trovare la documentazione.

Messaggio spedito dal sito Risorse.net


PRINT @PIPPO
Questa cosa qui sopra e' ancora diversa. Si puo' fare in PHP con:
	$exec = SQLExec($conn, "SELECT A FROM B WHERE C='D';");
	$rows = SQLNumRows($exec);
	$subset = "";
	$comma  = "";
	for ($row = 0; $row < $rows; $row++)
	{
		// Leggo uno alla volta tutti gli A
		$inset = SQLFetchResult($exec, $row, 0);
		$subset.="$comma'$inset'";
		$comma = ", ";
	}
	// Adesso $subset contiene qualcosa come
	// 'alpha', 'beta', 'gamma', 'delta', ...
	SQLDo($conn, "UPDATE tabella1 SET E='F' WHERE G IN ($subset);");
	...
	print $subset;
