SQL查询根据组填充索引字段

时间:2010-09-21 22:02:53

标签: sql

我对sql很新,并希望有人可以帮我处理更新查询。我有一个带有group_id(外键),user_id和user_index列的用户表。每个group_id对应多个用户,user_id是从1到表大小的串行列。

我正在寻找一个更新user_index列的查询,这样,对于每个group_id,每个用户都将拥有一个以1开头的唯一顺序索引。因此在组1中会有user_index 1,2,3。 ..并且在第2组中会有user_index 1,2,3 ......等等。这是一个澄清的例子:

初始状态:

user_id | group_id | user_index
1         1          0
2         1          0
3         1          0
4         2          0
5         3          0
6         3          0

期望状态:

user_id | group_id | user_index
1         1          1
2         1          2
3         1          3
4         2          1
5         3          1
6         3          2

我希望这很清楚。这在C或C ++中很容易做到,但我想知道是否有办法在sql中做到这一点。

1 个答案:

答案 0 :(得分:2)

UPDATE TableName
SET user_index = (SELECT COUNT(1) FROM TableName t2 
   WHERE t2.group_id = TableName.group_id AND t2.user_id <= TableName.user_id)

编辑:
在查看作者的评论后,我创建了一个测试,看看这是否是正确的解决方案。这是测试:

CREATE TABLE #table (user_id int, group_id int, user_index int)

INSERT INTO #table VALUES (1, 1, 0)
INSERT INTO #table VALUES (2, 1, 0)
INSERT INTO #table VALUES (3, 1, 0)
INSERT INTO #table VALUES (4, 2, 0)
INSERT INTO #table VALUES (5, 3, 0)
INSERT INTO #table VALUES (6, 3, 0)

SELECT * FROM #table

UPDATE #table
SET user_index = (SELECT COUNT(1) FROM #table t2 
WHERE t2.group_id = #table.group_id AND t2.user_id <= #table.user_id)

SELECT * FROM #table

DROP TABLE #table

两个选择的输出与作者的两个选择完全相同 - 第一个作为开始状态,第二个作为期望结果。