J'ai ce que je pense devrait être une tâche de mise à jour très simple, mais je suis bloqué pour le moment avec le problème suivant. J'ai une table temporaire pour laquelle je voudrais mettre à jour toutes les lignes à une valeur de n + 1 d'une autre table; par exemple:
La personne:
+--------+----+ | Name | N | +--------+----+ | A | 1 | | A | 5 | | A | 2 | | B | 8 | +--------+----+
@temp_Person:
+--------+--------+ | Name | NPlus1 | +--------+--------+ | A | NULL | | B | NULL | +--------+--------+
J'ai besoin de mettre à jour @temp_PersonTable pour que les valeurs de la colonne NPlus1 soient dérivées de la colonne N dans la table Person, quelque chose comme:
UPDATE @temp_table SET NPlus1 = ((SELECT MAX(N) FROM Person WHERE Person="A") + 1) WHERE @temp_table.Person = Person.Name UPDATE @temp_table SET NPlus1 = ((SELECT MAX(N) FROM Person WHERE Person="B") + 1) WHERE @temp_table.Person = Person.Name
Donc le résultat serait:
+--------+--------+ | Name | NPlus1 | +--------+--------+ | A | 6 | | B | 9 | +--------+--------+
Ai-je besoin d'écrire une instruction UPDATE individuelle pour chaque cas? Je me request comment j'écrirais un script SQL pour parcourir chaque nom DISTINCT en personne et faire la mise à jour, et pense actuellement que cette tâche serait plus facile à faire à partir d'une application séparée pour mettre à jour la table en utilisant une boucle foreach.
Vous avez juste besoin d'get les valeurs dans le cadre d'une sous-requête d'abord, puis JOIN
à cela.
UPDATE tp SET NPlus1 = SQ.max_N + 1 FROM @temp_Person TP INNER JOIN (SELECT Name, MAX(N) AS max_N FROM Person GROUP BY Name) SQ ON SQ.Name = TP.Name
Vous pouvez utiliser une seule instruction
update #temp_Person set NPlus1 = (select MAX(N) + 1 from Person where Name = #temp_Person.Name)