Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment mettre à jour à partir de SELECT dans SQL Server

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.