ms sql 2000 row_number代码

时间:2014-05-29 12:42:22

标签: sql sql-server-2000 row-number

我尝试使用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'列中的值进行更新...

非常感谢!!! :)

3 个答案:

答案 0 :(得分:1)

这意味着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
    
  3. 为了避免此问题,您可以考虑向表中添加主键,或者将更新基于唯一索引。在极少数情况下,您需要一个没有主键或唯一索引的表。如果您完全确定任何主键或唯一索引会损害架构,您可能需要模拟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     ....;