Dans cet article, nous aborderons les différentes méthodes d'utilisation de l'instruction UPDATE from SELECT dans SQL Server.
Dans le monde des bases de données, les données statiques ne sont généralement pas stockées. Au lieu de cela, il continue de changer lorsque nous mettons à jour des données existantes, archivons ou supprimons des données non pertinentes, etc. Par exemple, supposons que vous ayez une table qui stocke les données de tarification des produits pour votre portail d'achat. Les prix des produits changent constamment, car vous pouvez offrir des remises sur les produits à différents moments à vos clients. Dans ce cas, vous ne pouvez pas ajouter de nouvelles lignes dans le tableau car l'enregistrement de produit existe déjà, mais vous devez mettre à jour les prix actuels des produits existants.
C'est là que la requête UPDATE entre en jeu. La requête UPDATE modifie les données d'une ligne existante dans la base de données. Vous pouvez mettre à jour toutes les lignes de la table ou limiter les lignes affectées pour la mise à jour à l'aide de la clause WHERE. Habituellement, les mises à jour SQL sont effectuées pour une table existante avec une référence directe. Par exemple, dans une table [employé], une exigence doit augmenter le salaire de tous les employés actifs de 10 %. Dans ce cas, la requête SQL de référence directe sera :
Mettre à jour l'ensemble d'employés [salaire]=salaire + (salaire * 10 / 100) où [actif]=1
Supposons que vous ayez une autre table [Adresse] qui stocke les emplacements des employés et que vous deviez mettre à jour la table [Employé] en fonction des données disponibles dans la table [Adresse]. Comment mettre à jour les données dans la table [Employé] ?
Heureusement, il existe une solution - UPDATE à partir de l'instruction SELECT. Dans la section suivante, nous examinons différentes manières d'effectuer des mises à jour à l'aide d'une instruction SELECT. Par exemple, la table [Employee] a des valeurs NULL pour les colonnes - [PostCode] et [City] dans la capture d'écran suivante. La table [Address] contient des valeurs pour les deux colonnes [PostCode] et [City].
Méthode 1 :MISE À JOUR à partir de SELECT :Méthode de jointure
Cette méthode utilise des jointures SQL pour référencer la table secondaire qui contient des valeurs qui doivent être mises à jour. Par conséquent, la table cible est mise à jour avec les données des colonnes de référence pour les conditions spécifiées.
Il est assez simple d'utiliser l'instruction UPDATE from SELECT dans ce cas. Vous pouvez d'abord utiliser l'instruction SELECT pour récupérer les valeurs de la colonne de référence et de la colonne cible.
SELECT e.City,A.City, e.PostCode,A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Ensuite, vous apporterez de légères modifications à votre requête et elle préparera une instruction UPDATE comme indiqué ci-dessous.
- Remplacez le mot-clé select par update.
- Spécifiez le nom de la table ou le nom d'alias qui doit être mis à jour.
- Utilisez un mot-clé défini et le symbole égal (=) entre les colonnes de référence et cible.
UPDATE e set e.City=A.City, e.PostCode=A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Exécutez ensuite l'instruction UPDATE et vérifiez que les valeurs des colonnes source et cible sont identiques.
Méthode 2 :UPDATE à partir de SELECT :l'instruction MERGE
L'instruction MERGE est utile pour manipuler les données de la table cible en fonction des données de la table source pour les lignes correspondantes et non correspondantes. Il s'agit d'une méthode alternative pour effectuer la mise à jour à partir de la fonction d'instruction SELECT.
Dans l'exemple d'instruction MERGE ci-dessous, les tâches suivantes sont effectuées :
- Utilisez une instruction MERGE pour mettre à jour les données dans la table [Employee].
- Il référence ensuite une autre table lorsque la clause USING est appliquée.
- WHEN MATCHED spécifie alors la fusion JOIN (Inner Join) entre la table source et la table cible.
- Il met ensuite à jour [PostCode] et [City] de la table [Address] dans la table [Employee] à l'aide de l'instruction THEN UPDATE suivie des mappages de colonnes source et cible.
- L'instruction MERGE se termine toujours par un point-virgule (;).
MERGE Employee AS e USING(SELECT * FROM [Address]) AS A ON A.EmpID=e.EmpID WHEN MATCHED THEN UPDATE SET e.PostCode=A.PostCode , e.City = A.City;
Méthode 3 :UPDATE à partir de SELECT :méthode de sous-requête
La sous-requête définit une requête interne qui peut être utilisée dans une instruction SELECT, INSERT, UPDATE et DELETE. Il s'agit d'une méthode simple pour mettre à jour les données de table existantes à partir d'autres tables.
UPDATE Employee SET Employee.City=(SELECT [Address].city FROM [Address] WHERE [Address].EmpID = Employee.EmpId)
- La requête ci-dessus utilise une instruction SELECT dans la clause SET de l'instruction UPDATE.
- Si la sous-requête trouve une ligne correspondante, la requête de mise à jour met à jour les enregistrements pour l'employé spécifique.
- Si la sous-requête renvoie NULL (aucune ligne correspondante), elle met à jour NULL pour la colonne correspondante.
- Si la sous-requête renvoie plusieurs lignes correspondantes, l'instruction UPDATE génère une erreur :"La sous-requête SQL Server a renvoyé plus d'une valeur. Ceci n'est pas autorisé lorsque la sous-requête utilise des opérateurs de comparaison (=, !=, <, <=,>,>=)."
Limites des sous-requêtes
- La sous-requête avec un opérateur de comparaison ne peut inclure qu'un seul nom de colonne, sauf s'il est utilisé pour l'opérateur IN ou EXISTS. Par conséquent, si nous avons besoin de mettre à jour plusieurs colonnes de données, nous avons besoin d'instructions SQL distinctes.
- Vous ne pouvez pas utiliser ntext , texte , et image types de données dans la sous-requête.
- La sous-requête ne peut pas inclure GROUP BY et la clause HAVING si la sous-requête contient un opérateur de comparaison non modifié. L'opérateur de comparaison non modifié ne peut pas utiliser le mot clé ANY ou ALL.
Comparaison des performances entre différentes instructions UPDATE à partir de SELECT
Dans cette section, nous ferons la comparaison des performances entre les différentes méthodes UPDATE de SELECT. Pour ce faire, nous allons commencer par exécuter les requêtes SQL ensemble, en activant le plan d'exécution réel (Ctrl + M) dans SQL Server Management Studio et en les séparant à l'aide de l'instruction Go.
Dans les plans d'exécution, j'obtiens les données suivantes pour ma démo :
- Join Method a un coût de requête de 41 % (par rapport au lot global)
- L'instruction MERGE a un coût de requête de 34 % (par rapport au lot global)
- La méthode de sous-requête a un coût de requête de 24 % (par rapport au lot global)
La méthode JOIN utilise 40 % de coût pour le tri distinct et 35 % de coût pour la mise à jour de l'index clusterisé.
La jointure de fusion utilise une jointure interne pour faire correspondre les lignes de données entre les données source et cible. Il a également le coût relatif maximum pour l'opérateur de tri.
La sous-requête est la méthode la plus rapide pour mettre à jour les données des colonnes. Il utilise la mise à jour de l'index clusterisé et l'analyse de l'index clusterisé comme indiqué.
Pour plus de détails, vous pouvez vous référer à mes articles précédents : Plan d'exécution SQL Server :de quoi s'agit-il et comment résout-il les problèmes de performances ? et Comment lire et analyser les plans d'exécution SQL Server.
Résumé
Vous pouvez utiliser n'importe quelle méthode spécifiée dans cet article pour effectuer UPDATE à partir d'instructions SELECT. La sous-requête fonctionne efficacement, mais elle a ses propres limites, comme souligné précédemment. Les performances globales de votre base de données dépendent des données de la table, du nombre de mises à jour, des relations entre les tables, des index et des statistiques.