Ejemplos de instrucciones UPDATE
Para obtener más información acerca de las tablas utilizadas en los ejemplos siguientes, consulte Base de datos de muestra.
La tabla CATEGORY de la base de datos TICKIT contiene las siguientes filas:
+-------+----------+-----------+--------------------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+-----------+--------------------------------------------+ | 5 | Sports | MLS | Major League Soccer | | 11 | Concerts | Classical | All symphony, concerto, and choir concerts | | 1 | Sports | MLB | Major League Baseball | | 6 | Shows | Musicals | Musical theatre | | 3 | Sports | NFL | National Football League | | 8 | Shows | Opera | All opera and light opera | | 2 | Sports | NHL | National Hockey League | | 9 | Concerts | Pop | All rock and pop music concerts | | 4 | Sports | NBA | National Basketball Association | | 7 | Shows | Plays | All non-musical theatre | | 10 | Concerts | Jazz | All jazz singers and bands | +-------+----------+-----------+--------------------------------------------+
Actualización de una tabla en función de un rango de valores
Actualice la columna CATGROUP en función de un rango de valores en la columna CATID.
UPDATE category SET catgroup='Theatre' WHERE catid BETWEEN 6 AND 8; SELECT * FROM category WHERE catid BETWEEN 6 AND 8;
+-------+----------+----------+---------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+----------+---------------------------+ | 6 | Theatre | Musicals | Musical theatre | | 7 | Theatre | Plays | All non-musical theatre | | 8 | Theatre | Opera | All opera and light opera | +-------+----------+----------+---------------------------+
Actualización de una tabla en función de un valor actual
Actualice las columnas CATNAME y CATDESC en función del valor de CATGROUP actual:
UPDATE category SET catdesc=default, catname='Shows' WHERE catgroup='Theatre'; SELECT * FROM category WHERE catname='Shows';
+-------+----------+---------+---------+ | catid | catgroup | catname | catdesc | +-------+----------+---------+---------+ | 6 | Theatre | Shows | NULL | | 7 | Theatre | Shows | NULL | | 8 | Theatre | Shows | NULL | +-------+----------+---------+---------+)
En este caso, la columna CATDESC se configuró como nula porque no se definió un valor predeterminado cuando se creó la tabla.
Ejecute los siguientes comandos para establecer los datos de la tabla CATEGORY de regreso a los valores originales:
TRUNCATE category; COPY category FROM 's3://redshift-downloads/tickit/category_pipe.txt' DELIMITER '|' IGNOREHEADER 1 REGION 'us-east-1' IAM_ROLE default;
Actualización de una tabla en función del resultado de una subconsulta de la cláusula WHERE
Actualice la tabla CATEGORY en función del resultado de una subconsulta en la cláusula WHERE:
UPDATE category SET catdesc='Broadway Musical' WHERE category.catid IN (SELECT category.catid FROM category JOIN event ON category.catid = event.catid JOIN venue ON venue.venueid = event.venueid JOIN sales ON sales.eventid = event.eventid WHERE venuecity='New York City' AND catname='Musicals');
Consulte la tabla actualizada:
SELECT * FROM category ORDER BY catid;
+-------+----------+-----------+--------------------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+-----------+--------------------------------------------+ | 2 | Sports | NHL | National Hockey League | | 3 | Sports | NFL | National Football League | | 4 | Sports | NBA | National Basketball Association | | 5 | Sports | MLS | Major League Soccer | | 6 | Shows | Musicals | Broadway Musical | | 7 | Shows | Plays | All non-musical theatre | | 8 | Shows | Opera | All opera and light opera | | 9 | Concerts | Pop | All rock and pop music concerts | | 10 | Concerts | Jazz | All jazz singers and bands | | 11 | Concerts | Classical | All symphony, concerto, and choir concerts | +-------+----------+-----------+--------------------------------------------+
Actualización de una tabla en función del resultado de una subconsulta de la cláusula WITH
Para actualizar la tabla CATEGORY basándose en el resultado de una subconsulta utilizando la cláusula WITH, utilice el siguiente ejemplo.
WITH u1 as (SELECT catid FROM event ORDER BY catid DESC LIMIT 1) UPDATE category SET catid='200' FROM u1 WHERE u1.catid=category.catid; SELECT * FROM category ORDER BY catid DESC LIMIT 1;
+-------+----------+---------+---------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+---------+---------------------------------+ | 200 | Concerts | Pop | All rock and pop music concerts | +-------+----------+---------+---------------------------------+
Actualización de una tabla en función del resultado de una condición de combinación
Actualice las 11 filas originales en la tabla CATEGORY en función de las filas CATID coincidentes en la tabla EVENT:
UPDATE category SET catid=100 FROM event WHERE event.catid=category.catid; SELECT * FROM category ORDER BY catid;
+-------+----------+-----------+--------------------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+-----------+--------------------------------------------+ | 2 | Sports | NHL | National Hockey League | | 3 | Sports | NFL | National Football League | | 4 | Sports | NBA | National Basketball Association | | 5 | Sports | MLS | Major League Soccer | | 10 | Concerts | Jazz | All jazz singers and bands | | 11 | Concerts | Classical | All symphony, concerto, and choir concerts | | 100 | Concerts | Pop | All rock and pop music concerts | | 100 | Shows | Plays | All non-musical theatre | | 100 | Shows | Opera | All opera and light opera | | 100 | Shows | Musicals | Broadway Musical | +-------+----------+-----------+--------------------------------------------+
Tenga en cuenta que la tabla EVENT está enumerada en la cláusula FROM y la condición de combinación de la tabla de destino está definida en la cláusula WHERE. Solo cuatro filas califican para la actualización. Estas cuatro filas son las filas cuyos valores CATID eran originalmente 6, 7, 8 y 9; solo estas cuatro categorías están representadas en la tabla EVENT:
SELECT DISTINCT catid FROM event;
+-------+ | catid | +-------+ | 6 | | 7 | | 8 | | 9 | +-------+
Actualice las 11 filas originales en la tabla CATEGORY al extender el ejemplo anterior y agregar otra condición a la cláusula WHERE. Debido a la restricción en la columna CATGROUP, solo una fila califica para la actualización (aunque cuatro filas califican para la combinación).
UPDATE category SET catid=100 FROM event WHERE event.catid=category.catid AND catgroup='Concerts'; SELECT * FROM category WHERE catid=100;
+-------+----------+---------+---------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+---------+---------------------------------+ | 100 | Concerts | Pop | All rock and pop music concerts | +-------+----------+---------+---------------------------------+
A continuación se muestra una manera alternativa de escribir este ejemplo:
UPDATE category SET catid=100 FROM event JOIN category cat ON event.catid=cat.catid WHERE cat.catgroup='Concerts';
La ventaja de este enfoque es que los criterios de combinación están separados claramente de cualquier otro criterio que califica a las filas para la actualización. Observe el uso del alias CAT para la tabla CATEGORY en la cláusula FROM.
Actualizaciones con combinaciones externas en la cláusula FROM
El ejemplo anterior mostró una combinación interna especificada en la cláusula FROM de una instrucción UPDATE. El siguiente ejemplo devuelve un error, ya que la cláusula FROM no admite combinaciones externas en la tabla de destino:
UPDATE category SET catid=100 FROM event LEFT JOIN category cat ON event.catid=cat.catid WHERE cat.catgroup='Concerts'; ERROR: Target table must be part of an equijoin predicate
Si la combinación externa se requiere para la instrucción UPDATE, puede trasladar la sintaxis de la combinación interna a una subconsulta:
UPDATE category SET catid=100 FROM (SELECT event.catid FROM event LEFT JOIN category cat ON event.catid=cat.catid) eventcat WHERE category.catid=eventcat.catid AND catgroup='Concerts';
Actualizaciones con columnas de otra tabla en la cláusula SET
Para actualizar la tabla listing de la base de datos de muestra TICKIT con los valores de la tabla sales, utilice el siguiente ejemplo.
SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;
+--------+------------+ | listid | numtickets | +--------+------------+ | 100423 | 4 | | 108334 | 24 | | 117150 | 4 | | 135915 | 20 | | 205927 | 6 | +--------+------------+
UPDATE listing SET numtickets = sales.sellerid FROM sales WHERE sales.sellerid = 1 AND listing.sellerid = sales.sellerid; SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;
+--------+------------+ | listid | numtickets | +--------+------------+ | 100423 | 1 | | 108334 | 1 | | 117150 | 1 | | 135915 | 1 | | 205927 | 1 | +--------+------------+