我正在使用SQL Server 2008。
我有两个表: User_master 和 Item_master 。
有一位用户 user_id = 10。
|---------|
| user_id |
|---------|
| 10 |
|---------|
有5个项目 item_id = 20到24。
|---------|---------|------------|
| item_id | user_id | item_order |
|---------|---------|------------|
| 20 | 10 | 0 |
|---------|---------|------------|
| 21 | 10 | 0 |
|---------|---------|------------|
| 22 | 10 | 0 |
|---------|---------|------------|
| 23 | 10 | 0 |
|---------|---------|------------|
| 24 | 10 | 0 |
|---------|---------|------------|
Item_master 中还有一列 item_order(int)。 我想在所有这些行中仅使用单个查询将 item_order = 0设置为4.
有可能吗?
编辑:
item_id不应该是有序的。
例如,而不是20,21,22,23,24;它可能是20,25,31,47,58。
答案 0 :(得分:7)
您可以使用row_number()
窗口函数为每行使用相同的user_id
指定递增的数字。子查询是必需的,因为您不能直接在set
子句中使用窗口函数。
update im
set im.item_order = im.rn
from (
select row_number() over (partition by user_id
order by item_id) - 1 as rn
, *
from item_master
) as im;
答案 1 :(得分:3)
稍微推断一下,由于{item_id
,user_id
}在表中是唯一的,所以这是一个通用的解决方案:
UPDATE m
SET item_order = x.new_item_order
FROM item_master m
INNER JOIN (
SELECT [item_id], [user_id],
(ROW_NUMBER() OVER (PARTITION BY [user_id]
ORDER BY [item_id]))-1 AS [new_item_order]
FROM item_master
) x ON m.item_id = x.item_id AND m.user_id = x.user_id
这将为每个用户按item_order
的顺序设置item_id
列,从0开始。
答案 2 :(得分:1)
我假设您希望按用户分组以生成数字,并且item_order列已经存在,只需要更新?
update IM
set item_order = t.RowNumber
FROM Item_master IM
INNER JOIN
(select item_id , user_id , ROW_NUMBER() over(PARTITION BY user_id order by item_id ) -1 as 'RowNumber' from Item_master) T
ON T.item_id = IM.item_id