2015-05-14 52 views
1

我将数据从一个表插入另一个表。我只取最后一个值从第一表作为ID,需要从那里递增,所以我采取了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

我想,你正在寻找这样的事情。的@t + idID递增值和ROW_NUMBER()PARTITION BY

使用MAX(ID)获得分区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

感谢队友@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

同样,这个ID列可以是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以使其唯一。

另外,管理空值(对于第一记录)由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 
相关问题