我繼承一個表具有以下結構:CTE可以用來更新通行證嗎?
rowID rn userID Data1 Data2 Data3
----- -- ------ ----- ---- ----
1 1 1 A null 123
2 2 1 B 111 null
3 1 2 C 222 333
4 2 2 D null null
5 3 2 E 111 null
6 1 3 F 333 222
第一研究倫理委員會(rn=1
)需要被插入,而其餘的(rn <>1
)需要更新插入(順序地)。我可以很容易地插入,使用where rn = 1
並檢查是否存在用戶標識。
我的問題是,我需要現在使用rn <>1
順序更新所有recs,以便用戶表反映最新狀態。也就是說,更新後的用戶表應該是這樣的:
rowID userID Data1 Data2 Data3
----- ------ ----- ----- -----
1 1 B 111 123
2 2 E 111 333
3 3 F 333 222
我的想法是寫一個CTE,其中每個「通」將抓住所有的區域經濟共同體,其中RN = 2,則RN = 3,則RN = 4 ....直到我沒有更多的處理。這樣,我可以套上更新。
這是可能的(或者我應該使用do-while)嗎?如果是這樣,我需要遞歸還是「常規」CTE?
這裏是我的嘗試:
;with my_cte (rowID, rn, userID, Data1, Data2, Data3, val) As
(
SELECT rowID, rn, userID, Data1, Data2, Data3, val
from @MyTempTable x
where rn =1
UNION ALL
SELECT rowID, rn, userID, Data1, Data2, Data3, b.val +1
from @MyTempTable y
INNER JOIN
my_cte b
ON y.userID = b.userID
WHERE y.rn = b.val +1
)
UPDATE userTable
SET
[Data1] = COALESCE(c.Data1, [Data1])
,[Data2]= COALESCE(c.Data2, [Data2])
,[Data3]= COALESCE(c.Data3, [Data3])
From @MyTempTable c
JOIN
( SELECT user_id
FROM my_cte
WHERE rn<>1
) b
ON b.user_id = c.user_id
WHERE
EXISTS
( Select userID
from userTable q
Where q.userId = b.userId
)
我不能得到這個工作,它看起來像只有第一行更新。有什麼想法嗎?我是CTE的小菜。更重要的是,我想知道CTE究竟在做什麼...甚至有可能讓更新以「通行證」運行?
不應該'Data1'爲'userID' 1是** **乙和你當前最大的是'rn'? – 2012-02-17 07:18:55
@Lieven,你是對的。我編輯了原文。我不知道會發生什麼。目前這個數字已經達到了19,而且我確信我可以走得更高。 – user991945 2012-02-17 07:23:54