2014-03-27 33 views
0

我有一個表變量(@t_var)是這樣的:從同一個表變量更新表變量?

[RSIN] [Grp] 
S-000001 1 
S-000002 2 
S-000003 1 
C-000002 null 
C-000003 null 

我需要設置[GRP]「C」 -types基於[GRP]「S 「 -types分別有正確的部分。最後,我應該得到這樣的:

[RSIN] [Grp] 
S-000001 1 
S-000002 2 
S-000003 1 
C-000002 2 
C-000003 1 

最明顯的方法,我試圖做的事:

UPDATE @t_var 
SET  [Grp] = B.[Grp] 
FROM  @t_var A 
LEFT JOIN @t_var B 
     ON 'C'+RIGHT(A.[RSIN], 7) = B.[RSIN] 
WHERE  LEFT(A.[RSIN],1) = 'S' 

但Management Studio中告訴我一些事情不能明顯@t_var要使用的。當我們談論物理表時,這個構造工作正常,但在涉及表變量時拒絕工作。

是否有任何優雅的解決方法,但創建像@t_var2重複表變量,並在連接中使用它?

回答

0
declare @t_var table (RSIN char(8), Grp int); 

insert @t_var 
values 
    ('S-000001', 1), 
    ('S-000002', 2), 
    ('S-000003', 1), 
    ('C-000002', null), 
    ('C-000003', null) 

;with x as (
    select b.rsin, a.grp, b.grp as prev 
    from @t_var a 
    inner join @t_var b on 'c'+right(a.[rsin], 7) = b.[rsin] 
    where left(a.[rsin],1) = 's' 
) 
update x 
set prev = grp 

select * from @t_var 
+0

對我來說很好,謝謝! – user2838376

0
UPDATE @t_var 
SET [Grp] = CASE WHEN LEFT([RSIN], 1) = 'C' 
         AND RIGHT([RSIN], 1) = '2' 
       THEN 2 
       WHEN LEFT([RSIN], 1) = 'C' 
         AND (RIGHT([RSIN], 1) = '1' 
         OR 
         RIGHT([RSIN], 1) = '3') 
       THEN 1 
      END