在SQL中更新多行不同的值

9

我有一个像这样的表格:

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

我想将其改为:
SKU            Size
A              20
B              10
C              30
D              10
E              80
F              10
G              60

我有超过3000行的记录需要更新。如何使用SQL update命令进行更新?


3
更新各行为不同值的标准是什么? - Adriaan Stander
1
我们如何确定对每一行应该应用哪种变换? - Jonathan Leffler
你能否更明确地描述你的数据库结构。那些是列名,还是列中的某些值? - Waleed Al-Balooshi
SKU是您的表上的主键吗?为什么值在改变? - Yves M.
也许他想要执行 "update table set Size= sizeof (SKU);" ^^ - pinichi
显示剩余2条评论
6个回答

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

或许有一个计算尺寸的公式,但是你在问题中没有给出它(或者我们可能需要切换到更复杂的CASE表达式,但是问题中细节太少了)。


没有计算尺寸的公式。我会试着用你的建议。只需要从Excel中复制信息并将其添加到SQL命令中。它将以以下方式开始:- UPDATE T SET Size = CASE SKU WHEN 'A' THEN 20 WHEN 'B' THEN 10 WHEN 'C' THEN 30 WHEN ...(一直到3,000条记录) END - Bob
对我来说非常有效,谢谢Damien。我正在根据学位名称(所有文本字段)更改描述列中的文字。节省了大量不必要的UPDATE语句。 - Max West
2
我使用了上述查询,并将主键作为“WHEN”条件。对于一个大表(约4M条记录),如果我添加了“WHERE id in (...)”子句,我的查询速度会更快。 - myusuf

5
创建一个SKU到新尺寸的映射表,然后从中更新主表。
许多SQL方言都有一种通过连接表进行更新的表示法,但有些则没有。在没有这种表示法的情况下,此方法仍可行:
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);

主要的 WHERE 条件是为了避免在没有匹配行的情况下将大小设置为 null。

您可能还可以使用 MERGE 语句来实现。但是任何这些符号的关键洞察力都是您需要一个表来映射 SKU 和大小。您需要一个表格或算法,示例数据并没有提供算法。


0

利用OpenXML解决你的问题

例如

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

1
在SQL Server(或另一个支持RDBMS的系统)中,这是一种可行的方法,有时(不要笑)获取或传递数据的“最佳”方式是使用XML。虽然我并不真正推荐在这里使用它,但还是给个赞吧;-) - user166390

-1

只需要做...

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

对于您想更改的所有值都执行此操作...


我认为这是不可能的。我有超过3000个SKU,其中大多数都有不同的尺寸。10被设置为默认值,现在我必须用正确的值更新它,尽管有些SKU将保持为10。 - Bob
你有没有类似于 Excel 的列表,告诉你要设置什么?你可以根据这个生成 SQL 语句... - Yves M.
@Bob 有什么区别吗? :-) 输入来自某个地方,所以只需要将其转换为一个(或多个)适当的 SQL 语句。如果值保持不变,则不要设置它,或者如果设置它会保持相同的值,那就这样做。 - user166390
@Bob:这一定要记录在某个地方。那么你不能只是用 MySQL 作为模板生成 SQL 语句吗? - Yves M.
1
这个问题背后的整个想法是在一个查询中完成。考虑尝试一下@Damien_The_Unbeliever的答案。 - Mouradif

-1

如果你没有计算Size的公式,也没有文件或Excel表格可以将数据转换成表格,那么你只能让一些不幸的实习生打出类似以下的内容:

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

3000次。

如果您是那个实习生,我建议您提供更多的信息...


现在是吗?你指的是“消息文件数据”部分,对吧?因为我不知道Perl如何帮助处理模糊的口头说明或纸上的数字,或者实习生可能需要处理的任何东西。 - Christian Severin

-4

由于您想要更改整个列,请使用以下方法删除该特定列:

ALTER TABLE table_name
DROP COLUMN column_name;

然后使用以下代码创建一个新列:

ALTER TABLE table_name
ADD column_name varchar(80);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接