Where子句在Update中不起作用-设置查询

时间:2019-02-11 23:21:14

标签: mysql

我正在尝试通过加入另一个表来更新某些列。我有一个Y或N标志,并且对于这两个组有不同的更新。当我为1个组运行1个更新并指定标志时,它仍会更新我排除的行:

update orders a 
set a.rec_qty_ind= (select SUM(received_qty) from detail b
where a.item_id = b.item_id
and b.mabd <= mabd + 13
and b.mabd >= mabd -2 
and dc_id = 6969
and is_legacy = 'Y'
group by a.item_id)
;

应该进行is_legacy标志,以便仅更新Y行,但同时更新N行。有人知道发生了什么吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您的查询正在更新所有行,并将其设置为查询结果。从文档中:

  

如果通过设置为NULL更新已声明为NOT NULL的列,则在启用严格SQL模式的情况下会发生错误;否则,该列将设置为该列数据类型的隐式默认值,并且警告计数将增加。隐式默认值对于数字类型为0,对于字符串类型为空字符串(“),对于日期和时间类型为“零”值。请参见第11.7节“数据类型默认值”。

当MySQL不返回任何行时,它仍然尝试将a.rec_qty_ind设置为NULL。如果只想更新某些行,则需要在查询之外添加其他逻辑。以更好的格式查看它,您应该明白为什么会这样:

UPDATE orders a 
SET a.rec_qty_ind = (
    SELECT SUM(received_qty)
    FROM detail b
    WHERE a.item_id = b.item_id
    AND b.mabd <= mabd + 13
    AND b.mabd >= mabd -2 
    AND dc_id = 6969
    AND is_legacy = 'Y'
    GROUP BY a.item_id
)

这样的事情怎么样?

UPDATE orders a
INNER JOIN (
    SELECT b.item_id, SUM(received_qty) AS recieved_sum
    FROM detail b
    WHERE a.item_id = b.item_id
    AND b.mabd <= mabd + 13
    AND b.mabd >= mabd -2 
    AND dc_id = 6969
    AND is_legacy = 'Y'
    GROUP BY a.item_id
) b ON a.item_id = b.item_id 
SET a.rec_qty_ind = b.recieved_sum