Как генерировать последовательные числа в строковом столбце в SQL Server - PullRequest
0 голосов
/ 09 июля 2019

Я должен сгенерировать данные в таблице с добавленным столбцом последовательных чисел.

Для каждой ветви я должен вставить 3 пользователей с добавленными последовательными номерами (например, user1, user2, user3). Проблема здесь в том, что я должен сгенерировать строку ветвления также с добавленным последовательным номером (например, branch001, branch002, branch003, вплоть до branch700)

Например, ниже приведен пример структуры,

create table usersTable 
(
    id int identity(1,1),
    users nvarchar(100),
    branch nvarchar(100)
)

Ожидаемый результат:

id    users    branch
-----------------------
1     user1    branch1
2     user2    branch1
3     user3    branch1
4     user4    branch2
5     user5    branch2
6     user6    branch2
......    
n     usern    branch700
n     usern    branch700
n     usern    branch700

Может кто-нибудь подсказать, как этого добиться в SQL Server? Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Обновление

Чтобы увеличить число пользователей для всех филиалов, используйте row_number():

INSERT INTO usersTable (users, branch)
SELECT CONCAT('User', ROW_NUMBER() OVER(ORDER BY t1.number, t0.number)), 
       CONCAT('branch', t1.number)
FROM tally t0
CROSS JOIN tally t1
WHERE t0.number <= 3
AND t1.number <= 700
ORDER BY t1.number, t0.number

Оригинальная версия

Если у вас уже есть таблица подсчета (чисел), простой insert...select с использованием cross join и concat может получить необходимые данные:

INSERT INTO usersTable (users, branch)
SELECT CONCAT('User', t0.number), CONCAT('branch', t1.number)
FROM tally AS t0
CROSS JOIN tally AS t1
WHERE t0.number <= 3
AND t1.number <= 700

Если вы этого не сделаетеуже есть таблица подсчета, прочитайте этот пост о способах его создания.
Вы также можете прочитать этот пост администратора базы данных о том, почему вы на самом деле хотите его.

Если вы не можете или не хотите создавать таблицу подсчета, вы можете использовать общее табличное выражение для создания таблицы подсчета на лету - есть несколько способов ее создания - Гордон уже показал рекурсивный подход cte,поэтому я покажу другой - используя row_number и cross join:

With tally as
(
    SELECT TOP 700 ROW_NUMBER() OVER(ORDER BY @@SPID) As number
    FROM sys.objects a
    CROSS JOIN sys.objects b
)

INSERT INTO usersTable (users, branch)
SELECT CONCAT('User', t0.number), CONCAT('branch', t1.number)
FROM tally AS t0
CROSS JOIN tally AS t1
WHERE t0.number <= 3
AND t1.number <= 700
2 голосов
/ 09 июля 2019

Это отвечает первоначальной версии вопроса.

Вы можете сгенерировать данные с помощью рекурсивного CTE:

with u as (
      select v.users
      from (values ('user1'), ('user2'), ('user3')) v(users)
     ),
     n as (
      select 1 as n
      union all
      select n + 1
      from n
      where n < 700
     ) 
select u.users, concat('branch', n.n)
from u cross join
     n
order by n.n, u.users
option (maxrecursion 0);

Тогда insert выглядит так:

with u as (
      select v.users
      from (values ('user1'), ('user2'), ('user3')) v(users)
     ),
     n as (
      select 1 as n
      union all
      select n + 1
      from n
      where n < 700
     ) 
insert into usersTable (users, branch) 
    select u.users, concat('branch', n.n)
    from u cross join
         n
    order by n.n, u.users
    option (maxrecursion 0);

Здесь - это дб <> скрипка.

...