【问题标题】:Selective UPDATE Using CASE from two tables使用两个表中的 CASE 进行选择性更新
【发布时间】:2019-08-23 08:56:36
【问题描述】:

我有两张桌子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

我需要更新表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


【解决方案1】:
UPDATE I
SET I.Extra5 = M.QtyPerMeasure
FROM Item AS I
INNER JOIN Measure AS M ON M.ItemName = I.ItemName
    AND M.Unit = I.Unit

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

【讨论】:

  • 您能否为您的答案添加一些解释?
【解决方案2】:

我认为你只是想这样做。

UPDATE 
    Item 
SET 
    Extra5 = ISNULL(c.Unit, a.Unit)
FROM
    Item a
    INNER JOIN Measure b
        ON a.ItemName = b.ItemName
    LEFT JOIN Measure c 
        ON a.Unit = c.yksikko 

【讨论】:

  • 我不太确定ON a.Unit = c.yksikkoMeasure 表中也有 Unit。你怎么知道你可以通过这种方式加入它?过滤呢?
【解决方案3】:

你可以试试这个。在这里您可以使用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 

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多