在SQL中更新具有不同值的多个行

时间:2010-12-07 07:32:29

标签: sql sql-update

我有一张这样的表:

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更新命令执行此操作?

6 个答案:

答案 0 :(得分:18)

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

或者可能有一个计算大小的公式,但你没有在你的问题中给出它(或者我们可能不得不切换到更复杂的CASE表达式,但问题中的细节太少)。

答案 1 :(得分:4)

创建一个表格,其中包含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和大小之间的映射。您需要一个表,或者您需要一个算法,并且示例数据不建议算法。

答案 2 :(得分: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

答案 3 :(得分:0)

只做...

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

为要更改的所有值执行此操作...

答案 4 :(得分:0)

好吧,如果你没有公式来计算你的Size,并且你没有一个文件或一张Excel表格,你可以按下你的数据,你只需要必须让一些不幸的实习生输入类似

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

3000次。

如果你是那个实习生,我建议给我们更多信息......

答案 5 :(得分:-2)

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

ALTER TABLE table_name
DROP COLUMN column_name;

然后使用:

创建一个新列
ALTER TABLE table_name
ADD column_name varchar(80);