2013-05-30 31 views
8

Tôi đang cố gắng cập nhật một cột trong bảng của mình để sử dụng các giá trị 1 đến (số tối đa được quyết định bởi số lượng bản ghi).Cách cập nhật một cột của bảng thành giá trị chia tỷ lệ

Tôi không biết liệu tôi có đang giải thích quyền này hay không, vì vậy tôi đã thiết lập một SQLFiddle với dữ liệu tôi đang cố cập nhật.

SQL FIDDLE

Tôi muốn thiết lập cột Version tới 1 qua (số lượng tối đa). Có cách nào để viết lại truy vấn này lên thang số phiên bản không? Như trong, tôi muốn kỷ lục đầu tiên sử dụng 1, hồ sơ thứ hai để sử dụng 2, và vân vân ...

UPDATE Documents 
SET Version = 1 
+1

Bạn có thể đăng kết quả mong muốn không ?, Tôi vẫn không thực sự có được thứ bạn muốn – Lamak

Trả lời

4

Bạn có thể làm điều đó với một CTE và không gia nhập:

with RankedDocument as 
(
    select * 
    , rn = row_number() over (order by ID) 
    from Documents 
) 
update RankedDocument 
set Version = rn 

SQL Fiddle with demo.

+0

Điều này có vẻ dễ hiểu hơn phiên bản mà leoinfo được đăng. Nó cũng có vẻ như nó sẽ hiệu quả hơn vì không tham gia. – Zack

3

Từ những gì tôi có thể nói, bạn muốn mọi kỷ lục từ Documents để có một số version là số di chuyển từ 1 ..... N.

Bạn có thể sử dụng bảng tạm thời và kỹ thuật ROW_NUMBER để tăng số version và sau đó UPDATE trở lại bảng ban đầu của bạn.

CREATE TABLE #Temp (ID int, Version int) 

INSERT INTO #Temp (ID, Version) 
SELECT ID, ROW_NUMBER() OVER (ORDER BY ID ASC) 
FROM Documents 

UPDATE Doc 
SET Version = TT.Version 
FROM Documents AS Doc INNER JOIN #Temp AS TT ON Doc.ID = TT.ID 

DROP TABLE #Temp 

Nếu tôi hiểu bạn một cách chính xác ..

1

Hãy thử điều này:

;WITH list AS (
    SELECT 
     ID 
    , Version = ROW_NUMBER() OVER(ORDER BY VersionID ASC) 
    FROM Documents 
) 
UPDATE d SET 
    d.Version = x.Version 
FROM Documents AS d 
INNER JOIN list as x ON d.ID=x.ID 

SELECT * FROM Documents 

Bạn có thể thay đổi thứ tự (ORDER BY VersionID ASC) đến một trong những bạn cần.

+0

Tôi đã sử dụng phiên bản của bạn và tôi nghĩ rằng tôi đã nhận được nó ở nơi tôi cần. Tôi thực sự chỉ làm việc với SQL kể từ tháng 10 năm ngoái và chưa bao giờ nghe nói đến ROW_NUMBER(), vì vậy cảm ơn bạn vì đã chỉ cho tôi cách sử dụng nó! http://sqlfiddle.com/#!3/a09ed/48 – Zack

+0

Có lý do tại sao có dấu chấm phẩy ở đầu * của truy vấn này không? – Zack

+2

Đó chỉ là một thói quen mà tôi xây dựng để tránh gặp rắc rối ... :) Tùy thuộc vào những gì trước khi WITH trong mã của bạn, mã có thể thất bại nếu câu lệnh trên chấp nhận WITH như một đối số/tùy chọn. Xem "BEGIN GIAO DỊCH VỚI MARK", ví dụ. – leoinfo

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