4

我正在使用 SQL Server 2008。

我有两个表:User_masterItem_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。

4

3 回答 3

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;

SQL Fiddle 上的实时示例。

于 2013-02-07T11:49:44.600 回答
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

SQL 小提琴示例

这将为每个用户设置item_order列的顺序item_id,从 0 开始。

于 2013-02-07T11:48:14.287 回答
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
于 2013-02-07T11:53:42.993 回答