更新表集来自未按预期工作

时间:2014-11-24 20:07:10

标签: sql sql-server sql-server-2008

我正面临着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

请建议是否有任何解决方法可以使用自联接来更新表格。 感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以在更新声明中执行self join

不需要深度条件,深度条件,第3行父项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