SQL выделите строку X раз и вставьте в новый - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь перенести группу данных из старой базы данных в новую, в старой просто было количество аварийных сигналов, возникших в одной строке.Новая база данных вставляет новую запись для каждого возникающего аварийного сигнала.Вот базовая версия того, как это может выглядеть.Я хочу выбрать каждую строку из Таблицы 1 и вставить количество значений сигналов тревоги в виде новых строк в Таблицу 2.

Таблица 1:

|  Alarm ID    |  Alarm Value   |
|--------------|----------------|
|     1        |        3       |
|     2        |        2       |

Должно войти в таблицу аварийных сигналов, как показано нижезначения.

Таблица 2:

| Alarm New ID |  Value   |
|--------------|----------|
|     1        |    1     |
|     2        |    1     |
|     3        |    1     |
|     4        |    2     |
|     5        |    2     |

Я хочу создать сценарий выбора вставки, который будет делать это, поэтому оператор выбора вернет число строк, отображаемых в «Значение»"колонка.

Ответы [ 3 ]

4 голосов
/ 20 июня 2019

Рекурсивный CTE может быть удобен для этого:

with cte as (
      select id, alarm, 1 as n
      from t
      union all
      select id, alarm, n + 1
      from cte
      where n < alarm
     )
select row_number() over (order by id) as alarm_id, id as value
from cte
order by 1
option (maxrecursion 0);

Примечание. Если ваши значения не превышают 100, вы можете удалить OPTION (MAXRECURSION 0).

0 голосов
/ 20 июня 2019

Вместо использования rCTE, который является рекурсивным (как следует из названия) и потерпит неудачу в 100 строках, вы можете использовать таблицу Tally, которая также имеет тенденцию быть намного быстрее:

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;
0 голосов
/ 20 июня 2019

Репликация значений с помощью CTE.

DECLARE @T TABLE(AlarmID INT, Value INT)
INSERT @T VALUES
(1,3),
(2,2)

;WITH ReplicateAmount AS
 (
    SELECT  AlarmID, Value FROM @T

    UNION ALL

    SELECT R.AlarmID, Value=(R.Value - 1)
    FROM ReplicateAmount R 
    INNER JOIN @T T ON R.AlarmID = T.AlarmID
    WHERE R.Value > 1
)

SELECT 
    AlarmID = ROW_NUMBER() OVER( ORDER BY AlarmID), 
    Value = AlarmID --??
FROM
    ReplicateAmount 
ORDER BY 
    AlarmID

Это ответит на ваш вопрос.Я думаю, что приведенный ниже запрос будет более полезным, однако вы не включили контекст использования.

SELECT 
    AlarmID,
    Value 
FROM
    ReplicateAmount 
ORDER BY 
    AlarmID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...