Soh*_*eed 37 sql sql-server stored-procedures
我有一个INSERT INTO SELECT查询.在SELECT语句中,我有一个子查询,我想在一个字段中添加一个增量数字.如果我的SELECT查询只返回一条记录,则此查询将正常工作,但如果它返回多行,则会在增量字段中为所有这些行插入相同的数字.有没有办法限制它每次添加一个增量数?
INSERT INTO PM_Ingrediants_Arrangements_Temp
(AdminID,ArrangementID,IngrediantID,Sequence)
(SELECT
@AdminID, @ArrangementID, PM_Ingrediants.ID,
(SELECT
MAX(ISNULL(sequence,0)) + 1
FROM
PM_Ingrediants_Arrangements_Temp
WHERE
ArrangementID=@ArrangementID)
FROM
PM_Ingrediants
WHERE
PM_Ingrediants.ID IN (SELECT
ID
FROM
GetIDsTableFromIDsList(@IngrediantsIDs))
)
Run Code Online (Sandbox Code Playgroud)
Gor*_*off 67
您可以使用此row_number()功能.
INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence)
SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID,
row_number() over (order by (select NULL))
FROM PM_Ingrediants
WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs)
)
Run Code Online (Sandbox Code Playgroud)
如果你想从表中已有的最大值开始,那么:
INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence)
SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID,
coalesce(const.maxs, 0) + row_number() over (order by (select NULL))
FROM PM_Ingrediants cross join
(select max(sequence) as maxs from PM_Ingrediants_Arrangement_Temp) const
WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs)
)
Run Code Online (Sandbox Code Playgroud)
最后,您可以将sequence列设置为自动递增标识列.这样就无需每次都增加它:
create table PM_Ingrediants_Arrangement_Temp ( . . .
sequence int identity(1, 1) -- and might consider making this a primary key too
. . .
)
Run Code Online (Sandbox Code Playgroud)