2010-12-01 21 views
6

que tienen la siguiente tabla, que voy a llamar 'ejemplo'Usando SQL, ¿cómo actualizo las filas, usando sus propios valores?

id name  last_name 
01 Adam  Adams 
02 Bill  Billo 
03 Cathy  McCathyson 

tengo que modificar la mesa y terminar con lo siguiente:

id name 
01 Adam Adams 
02 Bill Billo 
03 Cathy McCathyson 

Para una sola fila, sé cómo para escribir esta consulta:

UPDATE example SET name = 
    (SELECT name FROM example WHERE id = 01)+" " 
    +(SELECT last_name FROM example WHERE id = 01) 
WHERE id = 01; 

¿Cómo modifico esta consulta de tal manera que se actualiza cada fila con los valores de la fila, como en el ejemplo?

EDIT: He actualizado mi ejemplo ya que confundió el problema.

+2

¿Quiere decir que desea incrustar el código HTML en los datos de la base de datos? ¿Por qué? – n8wrl

+1

Este es un buen ejemplo de por qué es una mala idea incorporar html en la base de datos. Hubiera sido mejor guardar el color y generar el html en la aplicación. –

+0

¿Alguna razón para el cambio en los datos de prueba? – Sathya

Respuesta

8
UPDATE example SET NAME = NAME + ' ' + last_name 

ID NAME  LAST_NAME 

 1 Adam  Adams 
    2 Bill  Billo 
    3 Cathy  McCathyson 

SQL> UPDATE example SET NAME = NAME + ' ' + last_name 
    2/

3 rows updated 

SQL> select * from example 
    2/

     ID NAME     LAST_NAME 
---------- ----------------------------------------- 
     1 Adam Adams    Adams 
     2 Bill Billo    Billo 
     3 Cathy McCathyson  McCathyson 
+0

Agregó su caso de prueba. – Sathya

4

NB: Esta respuesta se basó en la primera encarnación de la pregunta. Los mismos principios generales se aplican a la versión revisada, por lo que no actualicé los nombres de las columnas para mantenerme sincronizado.

@ n8wrl plantea una buena pregunta en los comentarios, pero para responder a su pregunta (suponiendo que tanto el color como el texto son datos de los caracteres y no necesitan ningún casting).

También he supuesto que ninguna de las columnas es nulable. Si están concatenados NULL dará NULL suponiendo que tiene opciones predeterminadas de ANSI. Si ese no es el comportamiento deseado que tendría que utilizar ISNULL(color,'') etc.

DECLARE @example table 
(
id int NOT NULL, 
color char(6) NOT NULL, 
text varchar(100) NOT NULL 
) 
insert into @example 
SELECT 01, '990000', 'Red' UNION ALL 
SELECT 02, '009900', 'Green' UNION ALL 
SELECT 03, '000099', 'Blue' 

UPDATE @example SET text = '<span style=''color: #' 
    +color+'''>' 
    +text+'</span>' 
/*WHERE id = 01;*/ 

SELECT * FROM @example 

Tengo que decir que dudo que almacenarlo en este formato es una buena idea. Esto significa que va a almacenar una gran cantidad de caracteres redundantes que significa menos filas caben en una página de datos y una mayor E/S y un uso menos eficiente de la memoria

+0

Esto solo funciona para la fila con id de 01. ¿Está diciendo que si elimino la cláusula WHERE, funcionará para cada fila? –

+0

Si está tratando de hacer toda la tabla, la cláusula 'WHERE' no es necesaria. – mlibby

+0

Cambie su DONDE a cualquier condición y ocurrirá para cualquier fila que cumpla con los criterios: todas las filas si no se incluye WHERE. –

7

Es posible que desee considerar agregar esto como computed column. De esa forma, la columna es virtual, por lo que no está utilizando espacio de almacenamiento adicional. Además, cualquier cambio en el nombre o apellido se refleja automáticamente en la nueva columna sin ninguna intervención.

EDIT: Código modificado basado en cambio en el ejemplo.

alter table example 
    add full_name as coalesce(name+' ','') + last_name 
+0

+1 para la columna calculada: normalmente no es una buena idea editar sus datos originales para un cambio estético :) – JNK

+1

+1 Sin una columna calculada, perderá la primera/última división original. ¡No hay vuelta atrás! –

+0

+1 porque esto es algo increíble que no sabía. Con mis datos reales, sí necesito combinar y eliminar, así que lamento no haber elegido esta respuesta. ¡Gracias, Joe! –

Cuestiones relacionadas