Aggiornamento via subquery, che cosa succede se la subquery restituisce nessuna riga?
-
11-09-2019 - |
Domanda
Sto usando una subquery in un aggiornamento:
UPDATE tableA
SET x,y,z = ( (SELECT x, y, z
FROM tableB b
WHERE tableA.id = b.id
AND (tableA.x != b.x
OR tableA.y != b.y
OR tableA.z != b.z))) );
La mia domanda è: cosa succede se la sottoquery non restituisce alcuna riga? Farà un aggiornamento con i null?
In secondo luogo, c'è un modo migliore per scrivere questo. Sto aggiornando fondamentalmente tre campi in tableA da tableB, ma l'aggiornamento dovrebbe avvenire solo se uno dei tre campi sono diversi.
Soluzione
che cosa succede se la subquery restituisce nessuna riga? Farà un aggiornamento con null?
Yes-- è possibile verificare questo tipo:
update YourTable
set col1 = (select 1 where 1=0)
Questo riempirà col1 con i NULL. Nel caso in cui la sottoquery restituisce più righe, come:
update YourTable
set col1 = (select 1 union select 2)
La banca dati genererà un errore.
In secondo luogo, c'è un modo migliore per Scrivi questo. Sto aggiornando fondamentalmente tre campi in tableA da tableB, ma l'aggiornamento dovrebbe avvenire solo se uno dei tre campi sono diversi.
Intuitivamente io non mi preoccuperei per le prestazioni. Se davvero si vuole evitare l'aggiornamento, è possibile scrivere le cose come:
UPDATE a
SET x = b.x, y = b.y, z = b.z
FROM tableA a, tableB b
WHERE a.id = b.id AND (a.x <> b.x OR a.y <> b.y OR a.z <> b.z)
La clausola WHERE
impedisce gli aggiornamenti con NULL.
Altri suggerimenti
Su Informix ho usato, una variante della soluzione di Andomar:
UPDATE a
SET x,y,z = ( (SELECT x, y, z
FROM tableB b
WHERE tableA.id = b.id) )
WHERE tableA.id IN (SELECT fromTable.id
FROM tableA toTable, tableB fromTable
WHERE toTable.id = fromTable.id
AND ((toTable.x <> fromTable.x)
OR (toTable.y <> fromTable.y)
OR (toTable.z <> fromTable.z))