J'ai un INSERT INTO SELECT
requête. Dans l'instruction SELECT
, j'ai une sous-requête dans laquelle je veux ajouter un nombre incrémentiel dans un champ. Cette requête fonctionnera correctement si ma requête SELECT
ne renvoie qu'un seul enregistrement. Toutefois, si elle renvoie plusieurs lignes, elle insère le même nombre dans le champ incrémentiel de toutes ces lignes. Y a-t-il un moyen de le restreindre pour ajouter un nombre incrémental à chaque fois?
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))
)
Vous pouvez utiliser la fonction row_number()
pour cela.
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)
)
Si vous voulez commencer avec le maximum déjà dans la table, alors faites:
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)
)
Enfin, vous pouvez simplement transformer la colonne sequence
en une colonne d’identité auto-incrémentée. Cela évite d'avoir à l'incrémenter à chaque fois:
create table PM_Ingrediants_Arrangement_Temp ( . . .
sequence int identity(1, 1) -- and might consider making this a primary key too
. . .
)