使用子查询时,Sqlite更新不会影响所有行

时间:2019-06-25 23:35:33

标签: sql sqlite

基于this answer,我试图基于表b中的值更新表a中的列,其中表b具有表{{的外键1}}。我的查询成功执行,并在受影响的行上按预期工作。但是,它不会影响所有行,而且我也不明白为什么。无论数据库多大,它似乎只影响三行。

以下是可重现的示例:

a

预期结果:

enter image description here

实际结果:

enter image description here

在sqlite 3.26.0上测试

2 个答案:

答案 0 :(得分:2)

您的更新声明:

UPDATE b SET SameQty = 0 WHERE aID = (SELECT aID from a where qty1 != qty2);

有一个可以返回多行的子查询,但是在只需要一行的上下文中使用。我觉得那应该引起一个错误,但是如果您没有看到一个错误,也许只是从结果中选择了一个任意行?

无论如何,您想要IN

UPDATE b SET SameQty = 0 WHERE aID IN (SELECT aID from a where qty1 != qty2);

答案 1 :(得分:2)

您使用的子查询在执行“ WHERE aID = (SELECT aID from a”时可以并且确实在标量上下文中返回多个行。使用IN代替=

UPDATE b SET SameQty = 0 WHERE aID IN (SELECT aID from a where qty1 != qty2);
UPDATE b SET SameQty = 1 WHERE aID IN (SELECT aID from a where qty1 = qty2);

db<>fiddle