3

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

现在我想更新table 中列出的所有值MODEL_ID的值table 。DEVICESDEVICE_IDD_IDCHANGE_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

4

2 回答 2

3

你最大的问题是你COUNT(*)为每一行发出一个devices- 这不是你真正需要做的;你会想要一个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也可以加快速度。

于 2013-03-14T19:52:00.290 回答
0
update devices a set model_id=(select change_model_id from change_values b where b.d_id=a.device_id) 
where device_id in (select d_id from change_values)
于 2013-03-15T06:31:28.203 回答