繁体   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