父ID层次结构标识MS SqlServer2012

时间:2017-06-28 17:22:20

标签: sql-server sql-server-2012

我有这段代码

            create table #temp
        (
            order_id int not null identity(1,1) primary key
            ,sid int
            ,created_date date
            ,parent_order_id int
        )

        insert into #temp
        (
             sid
            ,created_date

        )values(1,'2017-01-01') 

        insert into #temp
        (
             sid
            ,created_date
            ,parent_order_id

        )values(1,'2017-02-01',1),(1,'2017-03-01',2),(1,'2017-04-01',3)



        insert into #temp
        (
             sid
            ,created_date

        )values(1,'2017-06-01')

        insert into #temp
        (
             sid
            ,created_date
            ,parent_order_id

        )values(1,'2017-07-01',5),(1,'2017-08-01',6) 

        select * from #temp

每当parent_order_id为null时表示它是新订单。之后,客户可以添加与该订单关联的项目。所以我们为这些关联填充了parent_order_id。但我想知道每个关联子订单的第一个order_id是什么。我正在寻找下面的输出。

    `order_id   sid     created_date    parent_order_id   original_order_id
        1           1           2017-01-01      NULL                1
        2           1           2017-02-01      1                   1
        3           1           2017-03-01      2                   1
        4           1           2017-04-01      3                   1
        5           1           2017-06-01      NULL                4
        6           1           2017-07-01      5                   4
        7           1           2017-08-01      6                   4

` 任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用以下代码可以获得您期望的结果。

;WITH cte (order_id, original_order_id)
AS
(
    SELECT order_id, order_id AS original_order_id 
    FROM #temp WHERE parent_order_id IS NULL
    UNION ALL
    SELECT o.order_id AS order_id, cte.original_order_id AS original_order_id 
    FROM #temp AS o
    JOIN cte
      ON o.parent_order_id = cte.order_id 
)

SELECT #temp.order_id, #temp.sid, #temp.created_date, #temp.parent_order_id, cte.original_order_id 
FROM #temp
JOIN cte ON cte.order_id=#temp.order_id
ORDER BY cte.order_id

请注意,CTE对递归有一定的限制。目前它是100,可以推高到32767。