[英]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無法確定如何更新實際數據。 在兩種情況下可能會出現此錯誤:
您正在嘗試更新常量字段。 例:
update T set Title = N'New title goes here' from (select 'Old title' as Title) as T
您正在嘗試更新派生值。 例:
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.