使用来自另一个表的数据的 SQL 更新列

标签 sql oracle10g

我下面有 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/

相关文章:

oracle - 您如何从返回引用游标的Oracle过程中获得格式正确的结果?

mysql - 通过用户约束的映射连接两个表

python - 使用 Django 对唯一外键进行选择和排序

python - 使用可变数量的 WHERE 子句来匹配任意数量的关键字 pysqlite

oracle - 如何在 Oracle SQL Developer 中查看 refcursor 结果/输出?

error-handling - 在Oracle实例化 View 中记录导致错误的数据的方法?

java - 通过java连接oracle 10g Express版的问题

php - 如何在两个 MySQL 表的对抗中找到缺失的数字?

sql - 根据最近日期sql进行计数

oracle - 在匿名 block 内显示选择结果