Dans SQL Server , il est possible d' INSERT
entrer dans une table à l'aide d'une SELECT
instruction:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Est-il également possible de mettre à jour via un SELECT
? J'ai une table temporaire contenant les valeurs et je voudrais mettre à jour une autre table en utilisant ces valeurs. Peut-être quelque chose comme ça:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
jamesmhaley
la source
la source
SET Table.other_table_id = @NewValue
), remplacez l'instruction ON par quelque chose commeON Table.id = @IdToEdit AND other_table.id = @NewValue
Dans SQL Server 2008 (ou mieux), utilisez
MERGE
Alternativement:
la source
MERGE
peut également être utilisé pour les enregistrements "Upserting"; c'est-à-dire,UPDATE
si l'enregistrement correspondant existe, unINSERT
nouvel enregistrement si aucune correspondance trouvéeUPDATE
queMERGE
, les gens viennent d' apprendre à vivre avec eux et ils font partie du paysage ( « caractéristiques »). Considérez que les blogs n'existaient pas lorsqueUPDATE
le nouveau gamin était sur le bloc.la source
SET Table_A.col1 = SUM(Table_B.col1)
(ou toute autre fonction d'agrégation). Donc, mieux que la réponse de Robin Day à cet effet.Je modifierais l'excellente réponse de Robin aux éléments suivants:
Sans clause WHERE, vous affecterez même les lignes qui n'ont pas besoin d'être affectées, ce qui pourrait (éventuellement) provoquer un recalcul de l'index ou déclencher des déclencheurs qui n'auraient vraiment pas dû être déclenchés.
la source
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
est plus concis.Une manière
la source
Une autre possibilité qui n'est pas encore mentionnée est de simplement insérer l'
SELECT
instruction elle-même dans un CTE, puis de mettre à jour le CTE.Cela a l'avantage qu'il est facile d'exécuter l'
SELECT
instruction seule pour vérifier les résultats, mais cela vous oblige à aliaser les colonnes comme ci-dessus si elles sont nommées de la même manière dans les tables source et cible.Cela a également la même limitation que la
UPDATE ... FROM
syntaxe propriétaire indiquée dans quatre des autres réponses. Si la table source se trouve du côté plusieurs d'une jointure un-à-plusieurs, il est alors impossible de déterminer lequel des enregistrements joints correspondants possibles sera utilisé dans leUpdate
(problème quiMERGE
évite en générant une erreur en cas de tentative de mise à jour du même ligne plusieurs fois).la source
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Pour mémoire (et pour les autres qui recherchent comme moi), vous pouvez le faire dans MySQL comme ceci:
la source
En utilisant l'alias:
la source
La façon simple de le faire est:
la source
Cela peut être une raison de niche pour effectuer une mise à jour (par exemple, principalement utilisée dans une procédure), ou peut être évident pour d'autres, mais il convient également de préciser que vous pouvez effectuer une instruction de mise à jour-sélection sans utiliser la jointure (dans le cas où les tables entre lesquelles vous mettez à jour n'ont pas de champ commun).
la source
Voici une autre syntaxe utile:
Il vérifie s'il est nul ou non en utilisant "WHERE EXIST".
la source
J'ajoute cela uniquement pour que vous puissiez voir un moyen rapide de l'écrire afin de vérifier ce qui sera mis à jour avant de faire la mise à jour.
la source
Si vous utilisez MySQL au lieu de SQL Server, la syntaxe est:
la source
MISE À JOUR à partir de SELECT avec INNER JOIN dans la base de données SQL
Comme il y a trop de réponses à ce message, qui sont le plus fortement votées, j'ai pensé que je ferais ici aussi ma suggestion. Bien que la question soit très intéressante, j'ai vu sur de nombreux sites de forum et fait une solution en utilisant INNER JOIN avec des captures d'écran.
Au début, j'ai créé une table nommée avec schoolold et inséré quelques enregistrements en ce qui concerne leurs noms de colonne et l'exécute.
Puis j'ai exécuté commande SELECT pour afficher les enregistrements insérés.
Ensuite, j'ai créé une nouvelle table nommée avec schoolnew et exécuté de manière similaire les actions ci-dessus.
Ensuite, pour afficher les enregistrements insérés, j'exécute la commande SELECT.
Maintenant, ici, je veux apporter des modifications dans les troisième et quatrième lignes, pour terminer cette action, j'exécute la commande UPDATE avec INNER JOIN .
Pour afficher les modifications, j'exécute la commande SELECT .
Vous pouvez voir comment les troisième et quatrième enregistrements de table schoolold sont facilement remplacés par table schoolnew en utilisant INNER JOIN avec l'instruction UPDATE.
la source
Et si vous vouliez rejoindre la table avec elle-même (ce qui n'arrivera pas trop souvent):
la source
targett1
etsourcet1
plutôt que (ou ainsi que) des commentaires.L'exemple suivant utilise une table dérivée, une instruction SELECT après la clause FROM, pour renvoyer les anciennes et les nouvelles valeurs pour des mises à jour supplémentaires:
la source
La mise à jour via
CTE
est plus lisible que les autres réponses ici:la source
Si vous utilisez SQL Server, vous pouvez mettre à jour une table à partir d'une autre sans spécifier de jointure et simplement lier les deux à partir de la
where
clause. Cela rend une requête SQL beaucoup plus simple:la source
Consolider toutes les différentes approches ici.
Un exemple de structure de table est ci-dessous et sera mis à jour de Product_BAK vers la table Product.
Produit
Product_BAK
1. Sélectionnez la mise à jour
2. Mettre à jour avec une expression de table commune
3. Fusionner
Dans cette instruction Merge, nous pouvons faire un encart si vous ne trouvez pas un enregistrement correspondant dans la cible, mais existe dans la source et veuillez trouver la syntaxe:
la source
L'autre façon est d'utiliser une table dérivée:
Exemples de données
la source
Pour vous assurer que vous mettez à jour ce que vous voulez, sélectionnez d'abord
la source
Il existe même une méthode plus courte et cela pourrait vous surprendre:
Exemple de jeu de données:
Code:
la source
Utilisation:
SOIT:
OU:
Si le nom de la colonne ID est le même dans les deux tables, mettez simplement le nom de la table avant la table à mettre à jour et utilisez un alias pour la table sélectionnée, c'est-à-dire:
la source
Dans la réponse acceptée, après le:
J'ajouterais:
Ce que je fais habituellement, c'est de tout mettre dans une transaction roll back et d'utiliser le
"OUTPUT"
: de cette façon, je vois tout ce qui est sur le point de se produire. Quand je suis satisfait de ce que je vois, je le changeROLLBACK
enCOMMIT
.J'ai généralement besoin de documenter ce que j'ai fait, donc j'utilise l'
"results to Text"
option lorsque j'exécute la requête restaurée et j'enregistre à la fois le script et le résultat de la sortie. (Bien sûr, ce n'est pas pratique si j'ai changé trop de lignes)la source
la source
La solution ci-dessous fonctionne pour une base de données MySQL:
la source
L'autre façon de mettre à jour à partir d'une instruction select:
la source
Option 1: utilisation de la jointure interne:
Option 2: sous-requête associée à Co
la source
La syntaxe de l'instruction UPDATE lors de la mise à jour d'une table avec des données d'une autre table dans SQL Server
la source
Vous pouvez utiliser à partir de cela pour la mise à jour dans le serveur SQL
la source