我正在将数据从一个表插入到另一个表中。我只是将第一个表中的最后一个值作为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
答案 0 :(得分:1)
我想,你正在寻找类似的东西。
使用MAX(ID)
+ @t
的{{1}}增加id
和ID
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