2010-10-17 187 views
0

假设我有一组SQLite行,它们有一个自动增加字段“_id”,一个字符串字段“title”,一个整数字段“type”和一个整数字段“number”。基于查询排序的SQL行数?

只有几种类型(即1,2,3)。
所有数字字段当前都是空白的,我需要用1到N的数字填充类型为1的所有行。这些数字应该与标题字段(升序)具有相同的排序顺序。

行被编号后,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

您可以将ID设置为具有较小的标题行数:

UPDATE YourTable 
SET  Id = (
      select count(*) 
      from YourTable t2 
      where t2.title < YourTable.title 
      ) + 1 

这假定没有两行标题相同。

+0

如果我能做出这样的假设 – CodeFusionMobile 2010-10-17 19:45:02

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;