2013-06-01 35 views
32

Tôi có truy vấn INSERT INTO SELECT. Trong câu lệnh SELECT Tôi có truy vấn phụ mà tôi muốn thêm số gia tăng vào trường. Truy vấn này sẽ hoạt động tốt nếu truy vấn SELECT của tôi và trả về chỉ một bản ghi, Nhưng nếu nó trả về nhiều hàng, nó sẽ chèn cùng một số vào trường gia tăng cho tất cả các hàng đó. Có cách nào hạn chế nó để thêm số gia tăng mỗi lần không?Thêm số gia tăng vào một trường trong truy vấn CHỌN TỪ INSERT trong 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)) 
) 

Trả lời

54

Bạn có thể sử dụng chức năng row_number() cho việc này.

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

Nếu bạn muốn bắt đầu với mức tối đa đã có trong bảng sau đó làm:

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

Cuối cùng, bạn chỉ có thể làm cho cột sequence một cột sắc auto-incrementing. Điều này giúp tiết kiệm nhu cầu tăng mỗi lần:

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

cho tùy chọn thứ 3 tôi không phải thực hiện tăng tự động của trường thứ tự. tôi cần lấy số hiện tại từ trình tự và chèn số gia tăng tiếp theo vào cột đó –

+0

Scnerio 2 hoạt động trong tình trạng của tôi. cảm ơn bạn rất nhiều vì đã giúp đỡ ngay lập tức. –

+0

:: nếu cột vuông của tôi không cho phép giá trị null và bảng của tôi không có bất kỳ bản ghi nào. ngoại lệ ném của nó .... –

Các vấn đề liên quan