我尝试使用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 ...
一切都很好,我得到一个带有row_numbers的新列'NewValue'......
但是,当我尝试使用这个新列更新表中的一列时,我总是收到一个错误:
“派生表不可更新,因为派生表的列是派生的或常量的......”????有什么不对?
这是一个完整的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 ....
'Value'是表格中的一列,我无法使用'NewValue'列中的值进行更新...
非常感谢!!! :)
答案 0 :(得分:1)
这意味着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
,例如like this:
select
RowNumber = identity(int, 1, 1),
c.LastName,
c.FirstName
into #Customer_RowID
from SalesLT.Customer c
order by c.LastName asc
鉴于缺少唯一约束,请确保在事务中执行select-update以避免更新其他行。
答案 1 :(得分:1)
你应该改变一下,直接作为SET
子句中的子查询进行计数:
UPDATE P1
SET Value= (SELECT COUNT(*) FROM Persons P2
WHERE P2.Value<= P1.Value)
FROM Persons P1
WHERE ....
答案 2 :(得分:1)
我不确定为什么这种语法在SQL Server 2000中不起作用。我非常确定语法可以在更新版本的SQL Server中使用。
也许您应该考虑升级到支持的产品。
此版本可能有效:
UPDATE Persons
SET t.Value = (SELECT COUNT(*) FROM Persons P2 WHERE P2.Value <= Persons.Value)
WHERE ....;