假设我有一组SQLite行,其中包含自动增量字段“_id”,字符串字段“title”,整数字段“type”和整数字段“number”。
只有少数几种类型(即1,2,3) 所有数字字段当前都是空白的,我需要为类型1的所有行填充数字1到N.这些数字应与标题字段(升序)的排序顺序相同。
对行进行编号后,SELECT * FROM TABLE WHERE type=1 ORDER BY title
应返回与SELECT * FROM TABLE WHERE type=1 ORDER BY number
完全相同的结果。
我可以通过查询SELECT * FROM TABLE WHERE type=1 ORDER BY title
并循环遍历所有_id来逐行更新数字,但我正在寻找更有效的方法。
答案 0 :(得分:0)
您可以将ID设置为标题较小的行数:
UPDATE YourTable
SET Id = (
select count(*)
from YourTable t2
where t2.title < YourTable.title
) + 1
这假设没有两行具有相同的标题。
答案 1 :(得分:0)
如果您使用自动增量字段定义临时表,则按标题顺序复制您的记录应按正确顺序分配它们 - 然后您可以将新数字复制回原始表。我没有完全检查代码的SqlLite,但这是它在Sql Server中的工作原理,使用表变量来保持简单:
DECLARE @autonumbering TABLE (_id INT, title NVARCHAR(100), number INT identity);
INSERT INTO @autonumbering (_id, title)
SELECT _id, title FROM realtable WHERE type = 1 ORDER BY title;
UPDATE realtable
SET realtable.number = autonumbers.number
FROM realtable JOIN @autonumbering AS autonumbers
ON realtable.type = 1 AND realtable._id = autonumbers._id;