2015-05-14 65 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 
相關問題