基于查询排序的SQL行数?

时间:2010-10-17 16:46:00

标签: sql database sqlite

假设我有一组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来逐行更新数字,但我正在寻找更有效的方法。

2 个答案:

答案 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;