我对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中做到这一点。
答案 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
两个选择的输出与作者的两个选择完全相同 - 第一个作为开始状态,第二个作为期望结果。