从两个表中使用CASE进行选择性更新

时间:2019-08-23 08:56:36

标签: sql-server tsql join sql-update case

我有两个表ItemMeasure

项目:

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

我需要以查询根据Extra5选择相应值的方式更新表Item中的字段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是否毕竟是正确的方法。 我的方向完全错误吗?

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

ggd)

说明:查询将通过匹配Item和Measure表的itemname和unit列值来更新Extra5列。

答案 1 :(得分:0)

我认为您只是想这样做。

public class User {
    private final String name = "John";
}

答案 2 :(得分:0)

您可以尝试一下。在这里,您可以使用inner join获得所需的结果。然后只需根据需要对其进行更新。由于Item_nameUnit是相同的,并且两者的结合使得唯一密钥得以更新。

UPDATE ITEM
SET ITEM.Extra5 = MEASURE.QtyPerMeasure
FROM Item AS ITEM INNER JOIN Measure AS MEASURE 
ON ITEM.Unit = MEASURE.Unit AND ITEM.ItemName = MEASURE.ItemName