0
votes

SQL Sélectionnez une ligne x fois et insère dans de nouvelles

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 commentaires

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 et stockez le numéro d'instance sous forme de lignes distinctes. Et si vous modifiez la valeur de l'alarme 3 à 17?


3 Réponses :


4
votes

Un CTE récursif peut être pratique pour cela: xxx

REMARQUE: Si vos valeurs ne dépassent pas 100, vous pouvez supprimer l'option (maxrecursion 0) .


2 commentaires

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) au lieu de (maxrecursion 0) .



0
votes

Répliquer des valeurs avec un CTE. XXX PRE>

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


1 commentaires

Peu importe, je relisons votre question et il semble que le nombre de chaque alarme soit suivi par son occurrence dans la table.



0
votes

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;


1 commentaires

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.