curseur de mettre à jour une ligne avec les valeurs de la précédente et actuelle des lignes
Collègues Requête Écrivains,
J'ai un tableau comme suit:
myTable t1
col2 col3
2 1
3 0
4 0
5 0
6 0
et je veux mettre à jour chaque zéro sur col3 avec la valeur de col3 dans la rangée précédente, majorée de la valeur de col2 de la ligne actuelle. Donc ma table de comme suit:
myTable t1
col2 col3
2 1
3 4 (1+3)
4 8 (4+4)
5 13 (5+8)
6 19 (6+13)
Je suis absent la logique ici, la myopie peut-être. J'ai essayé avec un curseur comme suit:
DECLARE @var3 FLOAT
DECLARE cursor3 CURSOR FOR
SELECT col2, col3 FROM table1
FOR UPDATE OF col3
OPEN cursor3
FETCH FIRST FROM cursor3
WHILE (@@FETCH_STATUS > -1)
BEGIN
UPDATE @table1
SET col3 = isnull(@var3, 0) + isnull(col2, 0)
WHERE CURRENT OF cursor3
FETCH NEXT FROM cursor3 INTO @var3
END
mais c'est faux.
Des idées?
Merci d'avance.
- Avez-vous une autre colonne, comme une colonne d'ID sur la table? les curseurs sont presque jamais une bonne idée...
- D'autres colonnes, mais pas de Clé Primaire. C'est une table temporaire pour générer des rapports. Je suis assez convaincu que les curseurs existent pour ce type de problèmes.
- Les curseurs existent pour ce type de problèmes, mais cela ne veut pas dire qu'ils sont le meilleur/le plus approprié. Si vous ajoutez une colonne d'identité à votre table temp c'est environ la 10000x plus facile.
- Si j'ajoute une colonne d'Identité, comment pourrais-je résoudre le problème, alors?
- Je suis en train d'écrire la requête, donnez-moi une minute 🙂
- faire de votre temps.
- MMMMMMMMMMMMMMM peut-être pas, puisque vous souhaitez utiliser la mise à jour de la valeur pour calculer la ligne suivante.
- Oh que oui! Leçon du jour: ne jamais dénigrer les curseurs de nouveau. Écrire sur le tableau noir 100 fois. Merci quand même! 🙂
- Mensonges, je l'ai eu. Vérifier la réponse ci-dessous! 🙂
Vous devez vous connecter pour publier un commentaire.
OK, Essayez ceci.
Utilise un
WHILE
boucle qui doit être plus rapide qu'un curseur dans la plupart des circonstances.#Temp
ou@TableVar
type de tables de trop, j'ai juste fait un réel, l'autre pour le tester.J'ai ajouté une colonne d'identité à ma table et a fini à l'aide d'un code comme ceci:
Il a résolu mon problème. Merci à vous tous.
Voici une instruction de mise à JOUR qui utilise des expressions de table communes (CTE) pour mettre à jour les données.
FWIW de La principale raison impérieuse d'utiliser un CURSEUR est en ne le faisant pas, allez mettre trop d'un coup sur votre sgbdr. Vous pouvez presque toujours utiliser une boucle WHILE au lieu d'un CURSEUR; traitement d'UN enregistrement à la fois, qui peut être très utile lorsque, pour quelque raison que ce soit vous devrez peut-être effectuer une itération sur un grand nombre de documents... les opérations de CURSEUR sont encore plus efficaces que l'équivalent de l'opération.
Donc, en général, il revient à la vitesse & les frais généraux et efficacité...
Les CURSEURS sont en assez beaucoup la façon la plus lente, mais ont le moins de frais généraux et sont toujours utile, même dans MSSQL 2012 ...