powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Автоматическая последовательная нумерация
6 сообщений из 6, страница 1 из 1
Автоматическая последовательная нумерация
    #39699231
Задача следующая:
Имеется огромный чертёж с пронумерованными элементами-деталями (спецификацией). В процессе формирования чертежа нумерация деталей изменяется, но всегда сохраняется последовательность: от 1 с шагом 1.
Для спецификации используется таблица TabSpec с полями:
NomDetal int --Номер детали по спецификации на схеме;
NameDetal VarChar --Наименование детали;

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

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

Несколько деталей могут быть перемещены после конкретного номера (или скопированы).
Например:
- Скопировать "№4 Стопорное кольцо малое" и "№6 Стопорное кольцо большое" два раза после п.1
Получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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.
...
Рейтинг: 0 / 0
Автоматическая последовательная нумерация
    #39699238
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИгорьНектоИмеется ли какой-нибудь способ более быстрого пересчёта нумерации? Может через временные таблицы как-то?
ROW_NUMBER - пытался использовать, но не смог её результат записать в столбец NomDetal.
покажите, как пытались заполнить NomDetal при помощи ROW_NUMBER
...
Рейтинг: 0 / 0
Автоматическая последовательная нумерация
    #39699239
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИгорьНектоROW_NUMBER - пытался использовать, но не смог её результат записать в столбец NomDetal.
Код: sql
1.
2.
3.
4.
5.
6.
with t as
(
 select NomDetal, row_number() over (order by NomDetal) as n from TabSpec
)
update t
 set NomDetal = n;
...
Рейтинг: 0 / 0
Автоматическая последовательная нумерация
    #39699241
Shakill,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
Автоматическая последовательная нумерация
    #39699248
invm,

Благодарю! Всё получилось!
...
Рейтинг: 0 / 0
Автоматическая последовательная нумерация
    #39699289
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИгорьНекто,

может вам стоит пересмотреть архитектуру ?
к примеру, хранить данные в виде иерархии (связного списка - линейной "палки" от дерева): у каждого элемента, помимо ID, будет ещё и ParentID. Тогда перемещение элемента в списке, удаление или добавление - будет затрагивать минимум элементов, а нумерацию можно будет не хранить, а собирать "на лету" при помощи рекурсивного СТЕ в момент обращения к данным...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Автоматическая последовательная нумерация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]