我下面有 2 个表
DEVICES
--------------------
DEVICE_ID MODEL_ID
1 A
2 B
3 C
4 D
CHANGE_VALUES
----------------------------------------
D_ID CHANGE_MODEL_ID
1 E
4 F
现在我想更新 DEVICES
表中 MODEL_ID
的值,为 D_ID 中列出的所有
在表 DEVICE_ID
值CHANGE_VALUES
中。
我用来实现目标的 SQL 查询如下所示。但是,这似乎不是一个好的解决方案,因为对于 DEVICE_ID
的每个值,都需要执行 2 个子查询。在包含 ~ 3k 行的 CHANGE_VALUES 上运行它花了我 34 秒,这似乎很长。
UPDATE devices dev
SET dev.model_id =
(SELECT c_value.change_model_id
FROM change_values c_value
WHERE dev.device_id = c_value.d_id
)
WHERE 1 IN
(SELECT COUNT(*)
FROM change_values c_value
WHERE dev.device_id = c_value.d_id
);
由于我是 SQL 的新手,我不知道是否有任何现有的方法可以做同样的事情。所以我很想知道是否有更好的解决方案。
注意:我使用的是 Oracle 10g
最佳答案
您最大的问题是您要为 devices
中的每一行发出一个 COUNT(*)
- 这不是您实际需要做的;您将需要一个 EXISTS
子句。以下内容适用于任何 RDBMS:
UPDATE Devices d SET model_id = (SELECT c.change_model_id
FROM Change_Values c
WHERE c.d_id = d.device_id)
WHERE EXISTS (SELECT *
FROM Change_Values c
WHERE c.d_id = d.device_id);
显然,这是假设您在 Devices.device_id
上有一个索引。 Change_Values.d_id
上的一个也可能会加快速度。
关于使用来自另一个表的数据的 SQL 更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15418685/