2013-02-27 17 views
12

sto usando SQL Server e cercando di utilizzare SQL per aggiornare più tavoli contemporaneamente con una sola query:aggiornare le tabelle multiple in SQL Server utilizzando INNER JOIN

La seguente query:

update table1 
set A.ORG_NAME = @ORG_NAME, B.REF_NAME = @REF_NAME 
from table1 A, table2 B 
where B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

Dà il messaggio di errore:

Non è stato possibile associare l'identificatore di più parti "A.ORG_NAME".

Che cosa significa il messaggio di errore?

+2

In mancanza di come? Messaggio di errore? Non stai aggiornando quello che vuoi? –

+4

'AGGIORNA' a parte, per favore, per favore, per favore smetti di scrivere join vecchio stile. Utilizzare la sintassi corretta 'INNER JOIN'. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

risposta

20

Non è possibile aggiornare più di una tabella in una singola istruzione, tuttavia il messaggio di errore che si ottiene è a causa degli alias, si potrebbe provare questo:

BEGIN TRANSACTION 

update A 
set A.ORG_NAME = @ORG_NAME 
from table1 A inner join table2 B 
on B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

update B 
set B.REF_NAME = @REF_NAME 
from table2 B inner join table1 A 
    on B.ORG_ID = A.ORG_ID 
    and A.ORG_ID = @ORG_ID 

COMMIT 
+0

Grazie. È una buona pratica mettere la parola chiave 'end' dopo' commit'? o non è necessario? – Coyolero

+3

* BEGIN TRANSACTION * non è uguale a * BEGIN * che avvia un blocco (utilizzato in * IF *, ad esempio). Quindi non usare * END *, questa non è una questione di buone o cattive abitudini, potresti chiudere il blocco in cui ti trovi e trovare l'output inaspettato – jazzytomato

10

È possibile aggiornare con un join se si influenzano solo una tabella come questa:

UPDATE table1 
SET table1.name = table2.name 
FROM table1, table2 
WHERE table1.id = table2.id 
AND table2.foobar ='stuff' 

Ma si sta cercando di influenzare più tabelle con una dichiarazione di aggiornamento che unisce su più tavoli. Non è possibile.

Tuttavia, l'aggiornamento di due tabelle in un'unica istruzione è effettivamente possibile ma sarà necessario creare una vista utilizzando UNION che contenga entrambe le tabelle che si desidera aggiornare. È quindi possibile aggiornare la vista che aggiornerà le tabelle sottostanti.

SQL JOINS

Ma questo è un gioco di società davvero hacky, utilizzare la transazione e gli aggiornamenti più, è molto più intuitivo.

+3

La tua affermazione in grassetto non è del tutto vera. È possibile aggiornare una tabella in base a un join, non è possibile che l'aggiornamento * abbia effetto su più tabelle. E sono d'accordo sull'hack-i-ness del link suggerito (potrei anche suggerire di rimuoverlo). Vale veramente la pena fare tutto ciò per evitare di scrivere due affermazioni? –

+0

Il link non descrive come utilizzare un sindacato, forse era un altro post di quel blog? –