MY_TABLE會是這樣的:僅當在不同字段中存在具有給定值的多行時,才更新記錄集中的列?
user_id shared_field bool_field
------- ------------ ----------
1 abc null
2 def null
3 ghi Y
4 ghi null
5 ghi null
6 abc Y
7 jkl null
如果誰共享與其他用戶一樣shared_field(如USER_ID 3,4,5以上)的用戶的bool_field變化,只有一個用戶應該有'Y'。其餘的應該在bool_field列中有空值。例如,如果user_id 4現在應該具有'Y',則必須將user_id 4的bool_field更改爲'Y',並確保user_id 3和5的bool_field值爲null。
如果用戶不與其他人共享shared_field值,那麼該bool_field應該爲空(如上面的user_id 1和2所示)。
更新:添加了幾行以顯示多個user_id可以共享給定的shared_field(例如,1和6都有'abc'; 3,4和5都有'ghi' - 只有一個' abc'用戶應該具有'Y',並且只有一個'ghi'用戶應該具有'Y'等,而其餘的在他們的bool_field列中具有空;不共享shared_field值的user_id,例如user_ids 2和7,都應該在它們的bool_field列中全部爲空。)清除爲泥,對不對? ;)
此語句的工作原理:
UPDATE my_table
SET bool_field = (CASE
WHEN user_id = 4 THEN 'Y'
ELSE NULL
END)
WHERE shared_field = 'ghi'
AND (SELECT COUNT(shared_field)
FROM my_table
WHERE shared_field = 'ghi') > 1;
的問題:是有一些方法,我可以做到同樣的事情,而不事先知道shared_field價值?例如(當然這不起作用) - 更新:「當然」意味着我知道這是行不通的,因爲它是不正確的Oracle語法!重點是讓我知道我想要做什麼。
UPDATE my_table
SET bool_field = (CASE
WHEN user_id = 4 THEN 'Y'
ELSE NULL
END)
WHERE shared_field = (SELECT shared_field FROM my_table WHERE user_id = 4) as sharedVal
AND (SELECT COUNT(shared_field)
FROM my_table
WHERE shared_field = sharedVal) > 1;
更新:這是一個普通的SQL語句 - 我不能使用存儲過程。
您可以使用before update觸發器將shared_field的所有bool_Fields設置爲null,然後讓更新進程。或者把它放到一個事務過程中,然後調用它,第一步是將它們設置爲空,以更新一條記錄。如果問題全部回滾。 – xQbert 2014-10-31 20:30:20