2014-11-24 35 views
0

我面臨着SSMS 2012今天中午一個奇怪的問題,因爲我有如下表:更新表設置爲從工作不按預期

Serial_num  Item_NBR  SeqNo  Parent_SeqNo  Depth  Parent_Item_NBR 
AAA    123221   1   NULL   1   
AAA    112333   2    1   2   
AAA    223345   3    2   2 
AAA    122322   4    3   3 

而且我運行下面的查詢與parent_item_NBR更新表:

UPDATE tbl SET PARENT_ITEM_NBR = ( SELECT top 1 a.ITEM_NUM 
FROM tbl b where 
a.SERIAL_NUM = b.SERIAL_NUM and a.SEQNO=b.PARENT_SEQNO and a.DEPTH=b.DEPTH-1 
) FROM tbl a 

但它給我下面的結果:

Serial_num  Item_NBR  SeqNo  Parent_SeqNo  Depth  Parent_Item_NBR 
AAA    123221   1   NULL   1   123221 
AAA    112333   2    1   2   112333   
AAA    223345   3    2   2   223345 
AAA    122322   4    3   3   NULL 

相反,我需要

Serial_num  Item_NBR  SeqNo  Parent_SeqNo  Depth  Parent_Item_NBR 
AAA    123221   1   NULL   1   123221 
AAA    112333   2    1   2   123221 
AAA    223345   3    2   2   112333 
AAA    122322   4    3   3   223345 

請建議是否有任何解決方法利用自連接來更新表。 謝謝。

+1

您的更新查詢對我而言並不是很清楚您要做什麼。當然,你今天看到的結果甚至不能保證在未來工作(你有最高的1但沒有排序)。當然,如果您的數據不允許多個深度值,那麼頂端1可能是基於連接的冗餘。你能整理一些東西來幫助澄清你的問題嗎? sqlfiddle.com將是一個很好的開始。 – 2014-11-24 20:15:36

+0

嘗試將「UPDATE tbl」更改爲「UPDATE a」(換句話說,更新別名) – 2014-11-24 20:19:14

+0

@SeanLange我正在搞兩級嵌套獲取parent_Item_nbr,只需要級別嵌套。請看雷達的答案。那工作! – tom 2014-11-24 21:32:08

回答

0

您可以在更新語句不需要

深度條件做self join,隨着深度的條件,第三排父項NBR將第1行作爲 2-1 = 1

試試這個。

update p 
set Parent_Item_NBR = p1.item_nbr 
from project p 
join project p1 
on p.serial_num = p1.serial_num 
and isnull(p.parent_seqno,1) = p1.seqno 
1
;WITH CTE AS 
(
    SELECT A.PARENT_ITEM_NBR 
     ,C.TOP_ITEM_NUM 
    FROM tbl A 
     CROSS APPLY (SELECT top 1 a.ITEM_NUM 
         FROM tbl b 
         where a.SERIAL_NUM = b.SERIAL_NUM 
         and a.SEQNO = b.PARENT_SEQNO 
         and a.DEPTH = b.DEPTH-1 
        ) C(TOP_ITEM_NUM) 
) 
UPDATE CTE 
SET PARENT_ITEM_NBR = TOP_ITEM_NUM