Dans la plupart des cas, les mises à jour SQL sont effectuées à l'aide de références directes à une table particulière (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Pourtant, à l'occasion, il peut s'avérer avantageux de modifier le contenu d'un tableau indirectement , en utilisant un sous-ensemble de données obtenu à partir de l'instruction de requête secondaire.
Effectuer une UPDATE
en utilisant un SELECT
secondaire L'instruction peut être accomplie de deux manières, principalement en fonction de la version de SQL Server que vous utilisez. Nous allons brièvement explorer les deux options afin que vous puissiez trouver celle qui vous convient le mieux.
Utilisation des jointures internes
Pour toutes les installations de SQL Server, la méthode la plus simple pour effectuer cette action consiste à utiliser un INNER JOIN
, où les valeurs des colonnes de deux tables différentes sont comparées l'une à l'autre.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
Dans l'exemple ci-dessus, nous UPDATING
le books.primary_author
champ correspondant au authors.name
pour 'Le Hobbit' par JOINING
les deux tables de la requête à leurs valeurs correspondantes respectives de authors.id
et books.author_id
.
Utiliser MERGE pour mettre à jour et INSERT simultanément
Pour SQL Server 2008 et versions ultérieures, Microsoft a introduit l'exceptionnellement utile MERGE
opération similaire à l'opération INNER JOIN
ci-dessus méthode, mais MERGE
tente d'effectuer à la fois une UPDATE
et un INSERT
commander ensemble. Cela synchronise efficacement les deux tables en fonction de la requête effectuée, en mettant à jour et en insérant les enregistrements nécessaires pour que les deux correspondent.
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
La requête complète lors de l'utilisation de MERGE
est certainement un peu plus complexe que celle d'un INNER JOIN
de base , mais une fois que vous aurez compris le fonctionnement de l'opération, vous comprendrez rapidement à quel point cette capacité peut être vraiment puissante.
Les premières lignes sont assez explicites :
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Nous voulons MERGE INTO
(UPDATE
/INSERT
) les books
table en utilisant les authors
secondaires table, et nous faisons correspondre les deux sur la base du même books.author_id = authors.id
comparaison.
Où le MERGE
commande diffère dans la logique de branchement qui suit.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Ici, nous demandons à SQL d'effectuer une action uniquement lorsque les enregistrements MATCHED
– lorsqu'un enregistrement existant est trouvé. Dans ce cas, nous effectuons une UPDATE
standard comme nous l'avons fait auparavant, en définissant le books.primary_author
champ égal à authors.name
champ.
Enfin, si la requête découvre un enregistrement comparatif correspondant qui ne le fait pas existent, nous effectuons à la place un INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Ici, nous demandons simplement à SQL de INSERT
un nouvel enregistrement dans les books
table et en transmettant les valeurs pour le author_id
et primary_author
champs, extraits des authors
associés enregistrement de table.
Le résultat final de notre MERGE
déclaration est que pour chaque auteur dans authors
table, nous vérifions si un livre correspondant existe dans books
. Si un enregistrement est trouvé, nous nous assurons que books.primary_author
est défini à l'aide de UPDATE
, et lorsqu'aucune correspondance n'est trouvée, nous ajoutons un nouvel enregistrement à books
.
Avec cela, vous devriez avoir une solide compréhension de deux méthodes différentes qui peuvent être utilisées pour UPDATE
enregistrements en SQL en utilisant SELECT
secondaire et comparatif déclarations.