2015-05-14 6 views
1

Я вставляю данные из одной таблицы в другую таблицу. Я просто взять последние из первой таблицы в качестве идентификатора и нужно увеличивать оттуда, так что я взял MAX(ID) + 1 и делать прибавку, но я получаю то же значениеКак сделать автоинкремент на основе последнего значения из другой таблицы?

declare @t table (ID INT,VID INT,Sname Varchar(10),Rname Varchar(10)) 

INSERT INTO @t (ID,VID,Sname,Rname)VALUES 
    (4601,1,'Car','maruti'), 
    (4601,1,'Car','benz'), 
    (4601,1,'Car','honda') 

declare @tt table (ID INT,VID INT,Sname Varchar(10),Rname Varchar(10)) 

INSERT INTO @tt (ID,VID,Sname,Rname)VALUES 
(1,1,'Bike','Dio'), 
(1,1,'Bike','Pulsar'), 
(1,1,'Bike','Duke') , 
(2,1,'Cloth','jeans'), 
(2,1,'Cloth','shirts'), 
(2,1,'Cloth','short') 

INSERT INTO @t (ID,VID,Sname,Rname) 
Select (select MAX(ID)+1 FROM @t)Id,ROW_NUMBER()OVER(ORDER BY VID)VID,Sname,Rname 
from @tt 

Я не имею Удостоверение собственности либо на таблицах ,

Как получить такой вывод:

ID VID Sname  Rname 
4601 1 Car  maruti 
4601 2 Car  benz 
4601 3 Car  honda 
4602 1 Bike Dio 
4602 2 Bike Pulsar 
4602 3 Bike Duke 
4603 1 Cloth jeans 
4603 2 Cloth shirts 
4603 3 Cloth short 
+1

Вместо добавления 1 к MAX (ID) добавить @ tt.ID. – DeadZone

ответ

1

Я думаю, вы ищете что-то вроде этого.

Использование MAX(ID) из @t + id для инкрементируется значений ID и ROW_NUMBER() с PARTITION BY получить распределяли значения VID

INSERT INTO @t (ID,VID,Sname,Rname) 
Select (select MAX(ID) FROM @t) + id as Id,ROW_NUMBER()OVER(partition by id ORDER BY VID)VID,Sname,Rname from @tt 

вставленной Значения

4602 1 Bike Dio 
4602 2 Bike Pulsar 
4602 3 Bike Duke 
4603 1 Cloth jeans 
4603 2 Cloth shirts 
4603 3 Cloth short 
+0

спасибо mate @ughai – mohan111

0

Вы должны добавить дополнительную таблицу с данными что выглядит следующим образом:

 
ID  SName 
4601 Car 
4062 Bike 
4063 Cloth

Тогда вы можете иметь этот первый столбец только как автономный номер/идентификатор и позволить Sql Server обрабатывать это. В противном случае вы ставите под угрозу условия гонки.

существующей таблица должна выглядеть примерно так:

 
ID SID  RName 
1 4601 Maruti 
2 4601 Benz 
3 4601 Honda 
4 4602 Dio 
5 4602 Duke 
6 4602 Pulsar 
7 4603 Jeans 
8 4603 Shirts 
9 4603 Short

Опять же, этот идентификатор столбец может быть столбец autoincrememt/идентичности, такой, что Sql Server обрабатывает убедившись, что у вас нет конфликтов. Позже, если вам действительно нужен порядковый номер для каждого типа элемента, вы можете использовать функцию Row_Number() в сочетании с предложением PARTITION BY, чтобы получить набор результатов, который выглядит так, как вы хотите, и если вы хотите, чтобы это было более неотъемлемой частью данных, которые вы может построить это в представлении.

Дело в том, что вы хотите более четко отделить общую категорию предметов от конкретных записей в этой категории.

SELECT i.SID, ROW_NUMBER() OVER (PARTITION BY i.SID ORDER BY i.ID) as VID 
    , t.SName, i.RName 
FROM ItemTypes t 
INNER JOIN Items i on i.SID = t.ID 
ORDER BY i.SID, VID 
0

Ваш максимальный id является постоянным для всех записей.

Вам нужно будет добавить номер строки этой конкретной строки в ID, чтобы сделать ее уникальной.

Кроме того, Управление NULLS (для первой записи) с помощью функции IsNull ..

INSERT INTO @t (ID,VID,Sname,Rname) 
Select Isnull((select MAX(ID) FROM @t),0) + ROW_NUMBER()OVER(partition by id ORDER BY VID) Id,ROW_NUMBER()OVER(ORDER BY VID)VID,Sname,Rname 
from @tt 
Смежные вопросы