代码之家  ›  专栏  ›  技术社区  ›  John Hunter

如何计算SQL 2000中的订单行编号

sql
  •  1
  • John Hunter  · 技术社区  · 16 年前

    我使用的是一个订单系统,它有两个表——订单和订单行——相当标准的东西。我想为订单行计算一个订单行编号,例如

    orderid orderlineid行号
    1 1
    2 1
    2 2
    3 1
    4 1
    4 2

    orderlineid是标识列。我不想将行号作为数据存储在数据库中,原因有两个。首先,系统中已经存在大量现有订单和行,回顾性地添加数据是我希望避免的一个头痛问题。其次,如果用户删除了一行,那么我需要重新计算整个订单的行号。

    在SQL2005中,我可以使用row_number函数轻松地完成这项工作。

    Select Orderid, OrderLineid, ROW_NUMBER() 
    OVER(PARTITION BY Orderid ORDER BY Orderlineid) as LineNumber
    FROM OrderLine
    

    在SQL 2000中我是否可以这样做?

    我发现最接近的是一个排名函数(见下文),但这计算的是订单而不是行。

    SELECT x.Ranking, x.OrderId
    FROM (SELECT (SELECT COUNT( DISTINCT t1.Orderid) FROM orderline t1 WHERE z.Orderid >= t1.Orderid)AS Ranking, z.orderid 
    FROM orderline z ) x 
    ORDER BY x.Ranking
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   kristof    16 年前

    您可以使用如下内容:

    select 
        ol1.orderId,
        ol1.orderLineId,
        count(*) as lineNumber
    from 
        orderLine ol1
        inner join orderLine ol2 
            on ol1.orderId = ol2.orderId
            and ol1.orderLineId >= ol2.orderLineId
    group by 
        ol1.orderId, 
        ol1.orderLineId
    
        2
  •  0
  •   Kevin Fairchild    16 年前

    imho,每次你需要的时候计算它,结果可能会比它的价值更让人头疼。虽然更新历史行数并将其保存到数据库中可能会很痛苦,但您只会这样做一次…然后只需要编写代码来稍后实现自动化。

    要处理删除操作,只需将代码添加到现有的删除过程中,并让它重新计算其行号。

        3
  •  0
  •   Jonas Lincoln    16 年前

    另一种方法是将数据(没有行号)插入到一个临时表中,在该表中添加一个标识为(1,1)的列,然后从临时表中选择所有内容。