2017-06-28 16 views
0

parent_order_idは、それが新たなオーダーであることを示しているヌルであるときはいつでも、私はこのコード親ID階層識別MS SqlServer2012

  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が設定されています。しかし、私は各協会の子供の注文の最初の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 

「 」となります。前もって感謝します。

+0

再帰CTEを使用します。しかし、あなたが階層を決定するためにデータの序数の位置を使用しなければならない場合、何かがあなたのDBデザインでは見えないようです。 –

答えて

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までプッシュすることができます。

関連する問題