[英]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.