如何根据另一个表中的最后一个值进行自动增量?

时间:2015-05-14 13:54:45

标签: sql sql-server

我正在将数据从一个表插入到另一个表中。我只是将第一个表中的最后一个值作为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

我在两个表上都没有Identity Property。

如何获得这样的输出:

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

3 个答案:

答案 0 :(得分:1)

我想,你正在寻找类似的东西。

使用MAX(ID) + @t的{​​{1}}增加idID ROW_NUMBER()的值,以获得{{1}的分区值}}

PARTITION BY

插入值

VID

答案 1 :(得分: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 / identity列,以便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

答案 2 :(得分:0)

您的最大ID对于所有记录都是常量。

您必须将该特定行的行号添加到ID才能使其唯一。

另外,通过isnull函数管理Nulls(第一条记录)..

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