2012-08-24 31 views
9

Tôi có một bảng có tên Site với các cột Name, SiteIdSequence. Tôi muốn điền vào trường Sequence bằng số rownumber. Tôi đã thử truy vấn sau, nhưng nó không cập nhật các bản ghi:Cập nhật bằng CTE và số hàng làm truy vấn cập nhật TSQL hoặc hàng loạt với ROW_NUMBER()

WITH RowNumbers AS 
(
    select SiteId, 
      RowNum = row_number() OVER (order by SiteId) 
    from  [Site] 
) 
UPDATE s 
SET  s.[Sequence] = r.RowNum 
FROM [Site] as s INNER JOIN RowNumbers as r ON s.SiteId = r.Row 

Tôi đang làm gì sai?

Trả lời

15

Bạn có thể cập nhật trực tiếp CTE ...

WITH RowNumbers AS 
(
    select *, 
      RowNum = row_number() OVER (order by SiteId) 
    from  [Site] 
) 
UPDATE RowNumbers 
SET  [Sequence] = RowNum 

này hoạt động theo cách tương tự như một cái nhìn có thể cập nhật. Tôi đã thêm * để đảm bảo trường cập nhật đi qua và sau đó cập nhật trực tiếp.

+2

+1 Đây thực sự là cách để làm điều đó –

+0

Wow ... hoạt động như một sự quyến rũ. Có thể đọc được nhiều hơn. Không biết điều đó. –

+0

hoàn hảo, chính xác những gì tôi đang tìm kiếm! –

3

Bạn nên tham gia vào r.SiteID, không r.Row

WITH RowNumbers AS 
( 
    select SiteId, 
      RowNum = row_number() OVER (order by SiteId) 
    from  [Site] 
) 
UPDATE s 
SET  s.[Sequence] = r.RowNum 
FROM [Site] as s INNER JOIN RowNumbers as r ON s.SiteId = r.SiteID 
Các vấn đề liên quan