2009-12-01 16 views
5

estoy usando una subconsulta en un UPDATE:Actualización a través de subconsulta, ¿y si los subconsulta devuelve ninguna fila?

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)))); 

Mi pregunta es, ¿qué ocurre si la subconsulta no devuelve ninguna fila? ¿Va a hacer una actualización con nulos?

En segundo lugar, hay una manera mejor escribir esto. Básicamente estoy actualizando tres campos en la tabla A de la tabla B, pero la actualización solo debería ocurrir si cualquiera de los tres campos es diferente.

+0

caso de esta actualización se basa en un parámetro de unirse a TableB o se trata de una "actualización cartesiano"? – adamcodes

+0

'la actualización solo debería ocurrir si cualquiera de los tres campos es diferente. 'Suena como una cláusula where para mí ... –

Respuesta

5

¿Qué ocurre si la subconsulta devuelve sin filas? ¿Va a hacer una actualización con nulos?

sí-- puede probar esto como:

update YourTable 
set col1 = (select 1 where 1=0) 

Esto llenará col1 con nulos. En caso de que la sentencia devuelve varias filas, como:

update YourTable 
set col1 = (select 1 union select 2) 

La base de datos generará un error.

En segundo lugar, existe una mejor manera de escribir esto. básicamente estoy actualizando tres campos en tablaA de TableB, pero la actualización sólo debería ocurrir si cualquiera de los tres campos son distintos.

Intuitivamente no me preocuparía el rendimiento. Si realmente desea evitar la actualización, se puede escribir como:

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 cláusula WHERE evita actualizaciones con NULL.

+0

Eso se ve brillante, excepto que olvidé mencionar que estoy usando informix IDS 11.5, y no lo hago cree que informix admite FROM en la ACTUALIZACIÓN o se une en ACTUALIZACIONES. – rouble

+0

@prmatta: Informix admite el FROM en ACTUALIZAR, creo; He eliminado la UNIÓN INTERNA. – Andomar

+0

@Andomar, no creo que lo haga, al menos no la mía. La documentación dice que sí, pero seguí recibiendo un error de sintaxis. He actualizado el sql a algo sin referencias, me uno y lo puse como respuesta, hágamelo saber si le parece bien. – rouble

0

En Informix que utiliza, una variación de la solución de 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))