ahmed_sa Ответов: 1

Как написать запрос вставки данных в общие типы, увеличенные на единицу на основе максимального числа на typeid ?


Я работаю на sql server 2012 у меня есть имя таблицы GeneralTypes

как следует из этого

создание общих типов таблиц

(

TypeId int,

Имя типа nvarchar(50)

)

TypeId - это первичный ключ, но не идентификатор

У меня есть временная таблица как #tempGeneral

создать таблицу #tempGeneral

(

TypeId int,

Имя типа nvarchar(50)

)

Мне нужно вставить данные по общим типам на основе временной таблицы #tempGeneral

так что я проверю, существует ли максимальное значение в таблице GeneralTypes

тогда я увеличу его на единицу, когда вставлю

а если временная таблица #tempGeneral иметь значения, на имя не существует в таблице

затем получите максимум и увеличьте один

так что все, что мне нужно сделать, это написать запрос вставки данных в таблицу Generaltypes из #tempGeneral

#tempGeneral имеет следующее :

Мерседес

компания IBM

Мазда

Тойота

после вставки данных в таблицу GeneralTypes ожидаются следующие данные

ИД типа имя_типа

1 Мерседес

2 Ibm

3 Mazda

4 Toyota

предположим, я добавлю новые значения в #tempGeneral

Мерседес

компания IBM

Мазда

Тойота

Оппель

Хонда

Хундай

затем я проверю TypeName на таблице GeneralTypes

если typename на #tempGeneral существует в таблице GeneralTypes, то я не буду вставлять данные

если #tempGeneral иметь имя не существует в таблице № tempGeneral затем добавить typename и не было на столе GeneralTypes

так что я добавлю эти typename во второй раз

ИД типа имя_типа

5 Оппель

6 Хонда

7 Хундай

так что мне нужно написать один запрос insert data exist on #tempgeneral on table GeneralTypes increased by one

а если не существует то получите максимальное значение по идентификатору типа в таблице GeneralTypes и добавьте увеличенное на единицу

Что я уже пробовал:

вставить в GeneralTypes выберите TypeName из #tempGeneral

1 Ответов

Рейтинг:
2

Wendelius

Вы можете попробовать получить максимальное значение существующего идентификатора типа и добавить к нему номер строки. Что-то вроде

insert into GeneralTypes (TypeId, TypeName)
select Row_Number() over (order by TypeName)
       + coalesce((select max(b.TypeId)
                   from   GeneralTypes b), 0),
       TypeName
from #tempGeneral a
where not exists (select 1
                  from   GeneralTypes b
                  where  b.TypeName = a.TypeName)

Однако я бы пересмотрел использование идентификатора или последовательности для идентификатора типа, поскольку это исключило бы необходимость генерировать уникальные ключи. Еще одна вещь, которую вы должны иметь в виду:
- Если строка удаляется, этот идентификатор исчезает, и номер не будет использоваться повторно. Другими словами у вас есть дыра в вашей нумерации
- В зависимости от других факторов дизайна у вас могут возникнуть ключевые коллизии, если два или более сеансов объявления в таблицу добавляют одно и то же время.