基于组填充索引字段的SQL查询
我对sql相当陌生,希望有人能帮助我进行更新查询。我有一个users表,其中包含group\u id外键、user\u id和user\u索引列。每个组_id对应多个用户,用户_id是一个从1到表大小的串行列 我正在寻找一个将更新user\u index列的查询,这样,对于每个group\u id,每个用户都将有一个唯一的顺序索引,从1开始。所以在第1组中会有用户索引1,2,3。。。在第2组中会有用户指数1,2,3。。。等等下面是一个例子来说明: 初始状态:基于组填充索引字段的SQL查询,sql,Sql,我对sql相当陌生,希望有人能帮助我进行更新查询。我有一个users表,其中包含group\u id外键、user\u id和user\u索引列。每个组_id对应多个用户,用户_id是一个从1到表大小的串行列 我正在寻找一个将更新user\u index列的查询,这样,对于每个group\u id,每个用户都将有一个唯一的顺序索引,从1开始。所以在第1组中会有用户索引1,2,3。。。在第2组中会有用户指数1,2,3。。。等等下面是一个例子来说明: 初始状态: user_id | group_id
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中是否有一种方法可以做到这一点。p>
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
两次选择的输出与作者的两次选择完全相同——第一次选择作为开始状态,第二次选择作为期望结果。组成组的用户ID是否总是形成一个完整的序列?或者组_id=4可能是7、8、20中的用户_id吗?它们不是一个完整的序列,通常由于行被删除而丢失。这似乎是用该用户组中的用户数更新用户_索引,例如,如果组1中有12个用户,则每个用户的用户_索引都设置为12。不过,我会更深入地研究它。不,如果你仔细看WHERE子句的另一部分,它会将它设置为同一组中具有user_id的用户数。当我运行查询时,它会用我提到的每个组中的用户总数更新user_索引。它看起来非常接近,但还没有给出期望的结果。我用我在答案中输入的代码对其进行了测试,结果与您期望的结果相同。我也尝试了您的示例,它肯定能与我提供的示例数据一起工作。我的实际数据有点复杂,我仍然有一些问题让它工作,但我应该能够让它工作的基础上,你的建议。谢谢你的帮助!