2010-12-07 17 views
7

tengo una tabla como la siguiente:Actualizar varias filas con diferentes valores en SQL

SKU   Size 
A    10 
B    10 
C    10 
D    10 
E    10 
F    10 
G    10 

quiero cambiarlo a:

SKU   Size 
A    20 
B    10 
C    30 
D    10 
E    80 
F    10 
G    60 

tengo más de 3000 filas de registros para actualizar. ¿Cómo puedo hacer eso con el comando de actualización de SQL?

+3

y cuál sería el criterio para la actualización de varios filas a diferentes valores? –

+1

¿Cómo podemos saber qué transformación aplicar a cada fila? –

+0

Puede ser un poco más específico sobre la estructura de su base de datos. ¿Son cada una de esas columnas o algunos valores de columnas? –

Respuesta

0

Hacer uso de OpenXML para resolver su problema

ejemplo

declare @i int 

exec sp_xml_preparedocument @i output, 
'<mydata> 
    <test xmlID="3" xmlData="blah blah blah"/> 
    <test xmlID="1" xmlData="blah"/> 
</mydata>' 

insert into test 
select xmlID, xmlData 
from OpenXml(@i, 'mydata/test') 
with (xmlID int, xmlData nvarchar(30)) 
where xmlID not in (select xmlID from test) 

update test 
set test.xmlData = ox.xmlData 
from OpenXml(@i, 'mydata/test') 
with (xmlID int, xmlData nvarchar(30)) ox 
where test.xmlID = ox.xmlID 

exec sp_xml_removedocument @i 
+5

cuando tienes un martillo y todo eso .... –

+1

Es un enfoque viable en SQL Server (u otro RDBMS de soporte) y en ocasiones (no se ríe) la "mejor" forma de obtener o pasar los datos está en XML. No es que realmente lo recomiendo aquí, pero +1 de todos modos ;-) –

0

Eso sí, ...

UPDATE [yourTable] SET Size = 20 WHERE SKU = 'A' 

y hacer esto para todos los valores que desee cambiar ..

+0

No creo que eso sea posible. Tengo más de 3000 SKU y la mayoría de ellos en diferentes tamaños. 10 fue establecido como un valor predeterminado y ahora, tengo que actualizarlo con el valor correcto, aunque algunos SKUs permanecerán como 10. – Bob

+0

¿Tiene alguna lista de algún tipo que le indique qué configurar? Como excel? puede generar la instrucción SQL a partir de esto ... –

+0

@Bob ¿Y qué diferencia hace? :-) La entrada proviene de alguna parte, así que solo se trata de convertirla en una (o muchas) sentencias SQL apropiadas. Si el valor es el mismo, no lo configure o, si la configuración mantiene el mismo valor, entonces que así sea. –

16
UPDATE T 
SET Size = CASE SKU 
    WHEN 'A' THEN 20 
    WHEN 'B' THEN 10 
    WHEN 'C' THEN 30 
    WHEN ... 
END 

O puede que exista una fórmula para calcular el tamaño, pero no lo ha podido dar en su pregunta (O tal vez tengamos que cambiar a una expresión CASE más compleja, pero de nuevo, muy poco detalle en la pregunta).

+0

No hay una fórmula para calcular el tamaño. Lo intentaré con tu sugerencia. Solo necesita copiar la información de excel y agregarlos al comando SQL. Se iniciará algo como esto: - ACTUALIZACIÓN T SET = Tamaño CASO CUANDO SKU 'A' ENTONCES 20 cuando 'B' ENTONCES CUANDO 10 'C', entonces 30 CUANDO ... (todo el camino hasta 3.000 registros) END – Bob

+0

Funcionó muy bien para mí, gracias Damien. Estaba cambiando los literales en una columna de descripción basada en un nombre de grado (todos los campos de texto). Guardado un montón de instrucciones de ACTUALIZACIÓN innecesarias. –

0

Bueno, si no tiene una fórmula para calcular su Size s, y no tiene un archivo o una hoja de Excel con los datos que puede dar masajes a su tabla, solo tendrá que obtener algún interno sin suerte para escribir algo como

UPDATE <table> SET Size = <value> WHERE SKU = '<key>' 

3000 veces.

Si usted es esa pasante, sugeriría que nos da un poco más de información ...

+1

Esta es precisamente la razón por la cual Dios creó Perl ... –

+0

¿Es ahora? Me refieres, lo tomo, a la parte de "datos del archivo de masaje", ¿verdad? Porque no entiendo cómo Perl podría ayudar con vagas instrucciones verbales o números en una hoja de papel, o lo que sea que el interno tenga que tratar. –

4

Crear una tabla con el mapeo de SKU a nuevo tamaño; actualizar la tabla maestra de eso.

Muchos dialectos de SQL tienen una anotación para hacer actualizaciones a través de tablas unidas. Algunos no. Esto funciona cuando no hay tal notación:

CREATE TABLE SKU_Size_Map 
(
    SKU  CHAR(16) NOT NULL, 
    Size INTEGER NOT NULL 
); 
...Populate this table with the SKU values to be set... 
...You must have such a list... 

UPDATE MasterTable 
    SET Size = (SELECT Size FROM SKU_Size_Map 
       WHERE MasterTable.SKU = SKU_Size_Map.Size) 
WHERE SKU IN (SELECT SKU FROM SKU_Size_Map); 

La principal condición WHERE se necesita para evitar el ajuste del tamaño en nulo donde no hay fila coincidente.

Probablemente también pueda hacerlo con una instrucción MERGE. Pero la información clave para cualquiera de estas notaciones es que necesita una tabla para hacer la asignación entre SKU y tamaño. O necesita una tabla o necesita un algoritmo, y los datos de muestra no sugieren un algoritmo.

-2

Puesto que usted quiere cambiar toda la columna, la caída de esa columna en particular mediante el uso de esto:

ALTER TABLE table_name 
DROP COLUMN column_name; 

continuación, crear una nueva columna usando:

ALTER TABLE table_name 
ADD column_name varchar(80); 
Cuestiones relacionadas