簡體   English   中英

ms sql 2000 row_number代碼

[英]ms sql 2000 row_number code

我嘗試使用row_number函數為MS SQL 2000編寫SQL sintax ... SQL 2000不支持帶有OVER的row_number,所以我嘗試了這段代碼....

我寫這篇文章的時候:

    SELECT P1.*,
            (SELECT COUNT(*) FROM Persons P2 
                   WHERE P2.Value<= P1.Value ) AS NewValue
             FROM Persons P1
    WHERE ...

一切都很好,我得到一個新的列'NewValue'與row_numbers ...

但是,當我嘗試用這個新列更新表中的一列時,我總是收到一個錯誤:

“派生表不可更新,因為派生表的列是派生的或常量的......”???? 怎么了??

這是一個完整的sintax:

    UPDATE t
    SET    t.Value= t.NewValue
    FROM   (SELECT P1.*,
            (SELECT COUNT(*) FROM Persons P2 
                WHERE P2.Value<= P1.Value) AS NewValue
             FROM Persons P1) t
    WHERE     ....

“值”是表格中的一列,我無法使用“NewValue”列中的值進行更新...

非常感謝你!!! :)

這意味着SQL Server無法確定如何更新實際數據。 在兩種情況下可能會出現此錯誤:

  1. 您正在嘗試更新常量字段。 例:

     update T set Title = N'New title goes here' from (select 'Old title' as Title) as T 
  2. 您正在嘗試更新派生值。 例:

     update T set MaxPrice = 512 from (select max(Price) as MaxPrice) as T 

為避免此問題,您可以考慮向表中添加主鍵,或將更新基於唯一索引。 在極少數情況下,您需要一個沒有主鍵或唯一索引的表。 如果你完全相信任何主鍵或唯一索引會損害架構,您可能要模擬的row_number ,例如像這樣

select 
    RowNumber = identity(int, 1, 1),
    c.LastName,
    c.FirstName
into #Customer_RowID
from SalesLT.Customer c
order by c.LastName asc

鑒於缺少唯一約束,請確保在事務中執行select-update以避免更新其他行。

您應該將事物轉移並直接作為SET子句中的子查詢進行計數:

UPDATE P1
SET    Value= (SELECT COUNT(*) FROM Persons P2 
            WHERE P2.Value<= P1.Value)
FROM   Persons P1
WHERE     ....

我不確定為什么這種語法在SQL Server 2000中不起作用。我很確定語法可以在更新版本的SQL Server中使用。

也許您應該考慮升級到支持的產品。

此版本可能有效:

   UPDATE Persons
     SET t.Value =  (SELECT COUNT(*) FROM Persons P2 WHERE P2.Value <= Persons.Value)
     WHERE     ....;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM