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.

È stato utile?

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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top