代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

基于查询排序的SQL行数?

  •  0
  • CodeFusionMobile  · 技术社区  · 14 年前

    假设我有一组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 .

    我可以通过询问来做到这一点 从表格中选择*,其中类型=1按标题排序 通过循环所有的_id来逐行更新数字,但我正在寻找一种更有效的方法。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Andomar    14 年前

    您可以将id设置为标题较小的行数:

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

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

        2
  •  0
  •   Vince Bowdren    14 年前

    如果定义了一个带有自动递增字段的临时表,那么按标题顺序复制那里的记录应该按正确的顺序为它们分配编号,然后可以将新编号复制回原始表。我没有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;