SQL de mise à Jour de colonne avec des données provenant d'une autre table
J'ai 2 tableaux ci-dessous
DEVICES
--------------------
DEVICE_ID MODEL_ID
1 A
2 B
3 C
4 D
CHANGE_VALUES
----------------------------------------
D_ID CHANGE_MODEL_ID
1 E
4 F
Maintenant, je voudrais mettre à jour la valeur de MODEL_ID
dans DEVICES
table pour tous les DEVICE_ID
avoir des valeurs inscrites dans D_ID
dans le tableau CHANGE_VALUES
.
La requête SQL que j'ai utilisé pour réaliser l'objectif est montré ci-dessous. Cependant, il ne semble pas être une bonne solution, car pour chaque valeur de DEVICE_ID
, il est nécessaire d'effectuer 2 sous-requêtes. L'exécution de ce sur CHANGE_VALUES contenant ~ 3k lignes m'a pris 34 secondes, ce qui semble être long.
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
);
Comme je suis nouveau sur le SQL, je ne sais pas si il existe une manière qui peut faire la même chose. Donc, je suis curieux de savoir si est-il de meilleures solutions.
Note: je suis sous Oracle 10g
OriginalL'auteur Phuong Luu Hoang | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
Votre plus gros problème, c'est que vous êtes à la délivrance d'un
COUNT(*)
pour chaque ligne dedevices
- ce n'est pas ce que vous devez faire, vous aurez envie d'uneEXISTS
clause de la place. Les éléments suivants doivent travailler pour n'importe quel SGBDR:Évidemment, c'est en supposant que vous avez un index sur
Devices.device_id
. Un surChange_Values.d_id
peut aussi accélérer les choses.OriginalL'auteur Clockwork-Muse
OriginalL'auteur Aspirant