在 SQLITE 中更新多行

UPDATE multiple row in SQLITE

我正在使用 SQLite,我正在尝试使用 select 语句更新多行。

我有两个表:

设备:

ID|Name|param1|param2
----------------------
1 | D1 |  p1  |  p2
2 | D2 |  p1  |  p3
3 | D3 |  p1  |  p4

devices_in_groups

ID|ID_group|ID_device|
----------------------
1 |    0   |    1    |
2 |    0   |    2    |
3 |    1   |    3    |

我想更新组 0 中所有设备的所有 param1 属性。

我尝试类似的方法:

UPDATE device SET param1 = p10 
WHERE device.ID = (
SELECT ID_device 
FROM devices_in_groups 
WHERE devices_in_groups.ID_group = 0)

它只更新第一个设备 (D1) 而不是第二个 (D2),这与组 0 中的两个不同。

我该怎么做(在 SQLite 中)?

使用运算符IN:

UPDATE device 
SET param1 = 'p10' 
WHERE ID IN (
  SELECT ID_device 
  FROM devices_in_groups 
  WHERE ID_group = 0
);

参见demo

如果你的 SQLite 版本是 3.33.0+,你也可以用 UPDATE...FROM:

UPDATE device AS d 
SET param1 = 'p10'
FROM devices_in_groups AS g 
WHERE d.ID = g.ID_device AND g.ID_group = 0;

参见demo

即使你的子查询

SELECT ID_device 
FROM devices_in_groups 
WHERE devices_in_groups.ID_group = 0

returns

ID_device
1
2

主查询需要使用IN而不是=

= 表示您正在将 device.ID 值与查询结果(行)

进行比较

此外,p10 需要表示为字符串,否则会出现错误,因为没有 p10 列。

因此将查询更改为

UPDATE device SET param1 = 'p10' 
WHERE device.ID IN (
SELECT ID_device 
FROM devices_in_groups 
WHERE devices_in_groups.ID_group = 0
)

将按照您的预期工作并更新设备 table 中的所有记录。