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

ここで、テーブルにリストされているすべての値についてMODEL_ID、テーブル内の値を更新したいと思います。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を初めて使用するので、同じことを実行できる既存の方法があるかどうかはわかりません。だから私はもっと良い解決策があるかどうか知りたいです。

注:私はOracle10gを使用しています

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。1つで1つ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 に答える