J'essaie de migrer un tas de données d'une ancienne base de données vers une nouvelle base de données, l'ancienne utilisée pour avoir le nombre d'alarmes survenues sur une seule rangée. La nouvelle base de données insère un nouvel enregistrement pour chaque alarme qui se produit. Voici une version de base de la façon dont cela pourrait regarder. Je souhaite sélectionner chaque ligne du tableau 1 et insérez le nombre de valeurs d'alarme sous forme de nouvelles lignes dans le tableau 2.
Tableau 1: P>
| Alarm New ID | Value | |--------------|----------| | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 2 |
3 Réponses :
Un CTE récursif peut être pratique pour cela: REMARQUE: Si vos valeurs ne dépassent pas 100, vous pouvez supprimer l'option (maxrecursion 0) code>. p> p>
Quelques-uns des archives ont plus de 100 ans, où dois-je ajouter cela?
Remarque: Vous avez une faute de frappe dans votre SQL: (récursion maximale 0) code> au lieu de (maxrecursion 0) code>.
Répliquer des valeurs avec un CTE. Ceci répond à votre question. Je pense que la requête ci-dessous serait plus utile, cependant, vous n'avez pas compris le contexte d'utilisation. P> SELECT
AlarmID,
Value
FROM
ReplicateAmount
ORDER BY
AlarmID
Peu importe, je relisons votre question et il semble que le nombre de chaque alarme soit suivi par son occurrence dans la table.
Plutôt que d'utiliser une RCTE, qui est récursif (comme le nom le suggère) et échouera à 100 rangées, vous pouvez utiliser une table Tally, qui tendent à être bien plus rapide:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3)
SELECT ROW_NUMBER() OVER (ORDER BY V.AlarmID,T.I) AS AlarmNewID,
V.AlarmID
FROM (VALUES(1,3),(2,2))V(AlarmID,AlarmValue)
JOIN Tally T ON V.AlarmValue >= T.I;
C'est une bonne approche également, cependant, je suppose que cesser de retourner des résultats après une quantité définie de 100 000 enregistrements? Dans SQL Server, la limite de récursion peut être définie sur aucune limite.
Sauf absence de quelque chose, vos échantillons de données ne m'aient pas de sens pour moi du tout.
J'ai changé les noms de colonne, espérons que cela aide.
Notez qu'il est problématique d'utiliser la colonne code> code> et stockez le numéro d'instance sous forme de lignes distinctes. Et si vous modifiez la valeur code> code> de l'alarme 3 à 17?