2013-06-01 19 views
32

Ho una query INSERT INTO SELECT. Nell'istruzione SELECT ho una sottoquery in cui voglio aggiungere un numero incrementale in un campo. Questa query funzionerà correttamente se la mia query SELECT restituisce solo un record, ma se restituisce più righe inserisce lo stesso numero nel campo incrementale per tutte quelle righe. C'è un modo per limitarlo ad aggiungere un numero incrementale ogni volta?Aggiungere un numero incrementale in un campo nella query INSERT INTO SELECT in SQL Server

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 
      [email protected]) 
FROM 
    PM_Ingrediants 
WHERE 
    PM_Ingrediants.ID IN (SELECT 
           ID 
          FROM 
           GetIDsTableFromIDsList(@IngrediantsIDs)) 
) 

risposta

54

Per questo è possibile utilizzare la funzione 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) 
          ) 

Se si desidera avviare con la massima già nella tabella poi fare:

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) 
          ) 

Infine, si può solo fare la colonna sequence una colonna di identità incremento automatico. Ciò evita la necessità di incrementarlo ogni volta:

create table PM_Ingrediants_Arrangement_Temp (. . . 
    sequence int identity(1, 1) -- and might consider making this a primary key too 
    . . . 
) 
+0

per la terza opzione non è necessario eseguire l'incremento automatico del campo sequenza. Ho bisogno di ottenere il numero esistente dalla sequenza e inserire il successivo numero incrementale in quella colonna –

+0

Scnerio 2 funziona nelle mie condizioni. grazie mille per l'aiuto immediato. –

+0

:: se la mia colonna di squence non consente valori nulli e la mia tabella non ha già alcun record. la sua eccezione di lancio .... –

Problemi correlati