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

如何在SQL 2000中计算订单行号

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

    我正在使用一个订单系统,它有两个表order和OrderLine,这是非常标准的东西。我想为订单的订单行计算一个订单行号,例如。

    Orderid Orderlineid行号
    1 1 1
    2 2 1
    2 3 2
    3 4 1
    4 5 1
    4 6 2

    OrderLineId是一个标识列。我不想将行号作为数据存储在数据库中,原因有两个。首先,系统中已经有很多现有的订单和生产线,追溯添加数据是我希望避免的一个头疼的问题。其次,如果用户删除了一行,那么我需要重新计算整个订单的行号。

    在SQL 2005中,我可以使用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 回复  |  直到 9 年前
        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 年前

    依我之见,每次需要时计算它可能最终会让人头疼,而不值得。虽然更新历史行号并将其保存到数据库可能很痛苦,但你只会做一次。..然后只需要编写代码来稍后自动化它。

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

        3
  •  0
  •   Jonas Lincoln    16 年前

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