Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Автоматическая последовательная нумерация  [new]
ИгорьНекто
Member

Откуда:
Сообщений: 6
Задача следующая:
Имеется огромный чертёж с пронумерованными элементами-деталями (спецификацией). В процессе формирования чертежа нумерация деталей изменяется, но всегда сохраняется последовательность: от 1 с шагом 1.
Для спецификации используется таблица TabSpec с полями:
NomDetal int --Номер детали по спецификации на схеме;
NameDetal VarChar --Наименование детали;

С таблицей постоянно работают.
Несколько деталей могут быть удалены - нумерация последующих должна поменяться.
Например: было
NomDetal   NameDetal
1 Коленвал
2 Поршень малый
3 Шатун
4 Поршень большой
5 Вкладыш
Удалены "№2 Поршень малый" и "№4 Поршень большой".
Получилось:
NomDetal   NameDetal
1 Коленвал
2 Шатун
3 Поршень большой

Несколько деталей могут быть добавлены из соответствующего списка деталей после указанной позиции.
Например:
Добавлены подряд после "№2 Шатун":
- Палец малый
- Стопорное кольцо малое
- Палец большой
- Стопорное кольцо большое
Получилось:
NomDetal   NameDetal
1 Коленвал
2 Шатун
3 Палец малый
4 Стопорное кольцо малое
5 Палец большой
6 Стопорное кольцо большое
7 Поршень большой

Несколько деталей могут быть перемещены после конкретного номера (или скопированы).
Например:
- Скопировать "№4 Стопорное кольцо малое" и "№6 Стопорное кольцо большое" два раза после п.1
Получилось:
NomDetal   NameDetal
1 Коленвал
2 Стопорное кольцо малое
3 Стопорное кольцо большое
4 Стопорное кольцо малое
4 Стопорное кольцо большое
5 Шатун
6 Палец малый
7 Стопорное кольцо малое
8 Палец большой
9 Стопорное кольцо большое
10 Поршень большой

В дальнейшем поле NomDetal используется (например, для распечатки), и должно сохраняться в самой таблице.
Пока пересчёт поля NomDetal реализую через курсоры:
1) В курсоре таблицу TabSpec сортирую по NomDetal по возрастанию.
2) Двигаюсь в курсоре от нужного минимального до нужного максимального номера NomDetal (чтобы ускорить работу, а то мог бы и с начала таблицы и до её конца. Часто, например, при удалении, удобно удалять "выделенными блоками", например, с 23 по 27, с 134 по 154 и т.п., в результате всё равно приходится пересчитывать почти всю нумерацию).
3) Отдельное поле TempNom каждой записи увеличиваю на 1:
set @i=@i+1
update TabSpec
TempNom = @i
4) После завершения курсора заношу новую нумерацию в поле NomDetal, чтобы уже в дальнейшем с ним и работать:
update TabCpec
NomDetal = TempNom

Количество записей в спецификации не очень большое, до 1000.
Имеется ли какой-нибудь способ более быстрого пересчёта нумерации? Может через временные таблицы как-то?
ROW_NUMBER - пытался использовать, но не смог её результат записать в столбец NomDetal.
6 сен 18, 19:33    [21667429]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическая последовательная нумерация  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
ИгорьНекто
Имеется ли какой-нибудь способ более быстрого пересчёта нумерации? Может через временные таблицы как-то?
ROW_NUMBER - пытался использовать, но не смог её результат записать в столбец NomDetal.

покажите, как пытались заполнить NomDetal при помощи ROW_NUMBER
6 сен 18, 20:01    [21667445]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическая последовательная нумерация  [new]
invm
Member

Откуда: Москва
Сообщений: 9343
ИгорьНекто
ROW_NUMBER - пытался использовать, но не смог её результат записать в столбец NomDetal.
with t as
(
 select NomDetal, row_number() over (order by NomDetal) as n from TabSpec
)
update t
 set NomDetal = n;
6 сен 18, 20:06    [21667448]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическая последовательная нумерация  [new]
ИгорьНекто
Member

Откуда:
Сообщений: 6
Shakill,

UPDATE T 
SET T.TempNom = TT.ROW_ID
FROM [dbo].[TabSpec] AS T
INNER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY NomDetal) AS ROW_ID
, NomDetal
FROM [dbo].[TabSpec]) AS TT
ON T.NomDetal = TT.NomDetal
where T.ID_NomShem = 4300
6 сен 18, 20:10    [21667453]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическая последовательная нумерация  [new]
ИгорьНекто
Member

Откуда:
Сообщений: 6
invm,

Благодарю! Всё получилось!
6 сен 18, 20:25    [21667463]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическая последовательная нумерация  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1467
ИгорьНекто,

может вам стоит пересмотреть архитектуру ?
к примеру, хранить данные в виде иерархии (связного списка - линейной "палки" от дерева): у каждого элемента, помимо ID, будет ещё и ParentID. Тогда перемещение элемента в списке, удаление или добавление - будет затрагивать минимум элементов, а нумерацию можно будет не хранить, а собирать "на лету" при помощи рекурсивного СТЕ в момент обращения к данным...
7 сен 18, 04:09    [21667594]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить