【发布时间】:2019-08-23 08:56:36
【问题描述】:
我有两张桌子Item 和Measure。
项目:
ItemName | Unit | Extra5
------------|-----------|--------
bolt | PCS |
nut | M2 |
Screw | M3 |
Slug | JM |
测量:
ItemName | Unit | QtyPerMeasure
------------|-----------|--------------
bolt | PCS | 1
bolt | M2 | 2
bolt | M3 | 3
bolt | JM | 4
nut | PCS | 11
nut | M2 | 22
nut | M3 | 33
nut | JM | 44
Screw | PCS | 111
Screw | M2 | 222
Screw | M3 | 333
Screw | JM | 444
Slug | PCS | 1.1
Slug | M2 | 2.2
Slug | M3 | 3.3
Slug | JM | 4.4
我需要更新表Item 中的字段Extra5,使查询根据Unit 选择相应的值。
结果应该是这样的:
ItemName | Unit | Extra5
------------|-----------|--------
bolt | PCS | 1
nut | M2 | 22
Screw | M3 | 333
Slug | JM | 4.4
到目前为止我已经尝试过:
UPDATE
Item
SET
Extra5 =
CASE (SELECT Unit FROM Item)
WHEN 'PCS' THEN SELECT Unit FROM Measure WHERE yksikko = 'PCS'
WHEN 'JM' THEN SELECT Unit FROM Measure WHERE yksikko = 'JM'
WHEN 'M2' THEN SELECT Unit FROM Measure WHERE yksikko = 'M2'
WHEN 'M3' THEN SELECT Unit FROM Measure WHERE yksikko = 'M3'
FROM
Item a
INNER JOIN Measure b
ON a.ItemName = b.ItemName
这给了我一个错误:Msg 156, Level 15, State 1, Line 16. Incorrect syntax near the keyword 'SELECT'.
我在想CASE 是否毕竟是正确的方法。
我是不是走错了方向?
任何帮助将不胜感激。
【问题讨论】:
-
当使用
CASE转换成CASE {value} WHEN {expression}...格式时,{value}必须是文字,它不能是表达式,当然也不能是数据集。 -
yksikko?使用Unit查找Unit并替换Unit看起来没有效率。您应该能够使用case a.Unit when 'PCS' then ( select m.Unit from Measure as m where m.Unit = a.Unit ) ... end,但它非常没有意义,并且涉及重复文字值('PCS'),而它应该都是表驱动的。无论如何,使用join的答案之一是一个更好的主意。
标签: sql-server tsql join sql-update case