【问题标题】:Update OrderID based on the Select Order By Results?根据 Select Order By Results 更新 OrderID?
【发布时间】:2018-10-03 08:46:59
【问题描述】:

我用的是SQLite 3,我有一个MyTable表,如下:

    Create table mytable (ID as INTEGER, OrderID as INTEGER, a as INTGER, b as INTEGER);

    Insert into mytable (ID, OrderID,a,b) values (1, 1,1,1);
    Insert into mytable (ID, OrderID,a,b) values (1, 2,1,2);
    Insert into mytable (ID, OrderID,a,b) values (2, 1,1,3);
    Insert into mytable (ID, OrderID,a,b) values (2, 3,2,1);
    Insert into mytable (ID, OrderID,a,b) values (3, 1,2,3);

现在如果我使用以下语句:

Select * from mytable ORDER BY a desc, b desc;

我将以不同的顺序获取所有行,如下所示:

    (3, 1, 2, 3); 
    (2, 3, 2, 1); 
    (2, 1, 1, 3); 
    (1, 2, 1, 2); 
    (1, 1, 1, 1);

现在我想将订单ID更新为上面结果中出现的行的序号,如下:

    (3, 1, 2, 3); 
    (2, 2, 2, 1); 
    (2, 3, 1, 3); 
    (1, 4, 1, 2); 
    (1, 5, 1, 1);

怎么做?

【问题讨论】:

  • 4,5 如何进入结果集
  • 4 表示结果行集中的第 4 行,5 表示结果行集中的第 5 行。

标签: sql sqlite row-number


【解决方案1】:

试试这个:-

      Select ROW_NUMBER() OVER (ORDER BY (SELECT 1 ) ) AS ordNo, * INTO #TempTable  from 
         mytable ORDER BY a desc, b desc;

UPDATE mytable SET OrderID = ordNo FROM #TempTable WHERE mytable.ID =#TempTable.ID AND mytable.a=#TempTable.a AND mytable.b=#TempTable.b

【讨论】:

    【解决方案2】:

    假设ab 值是唯一的:

    update mytable t
        set orderid = (select count(*)
                       from mytable t2
                       where t2.a > t.a or
                             (t2.a = t.a and t2.b >= t.b)
                      );
    

    【讨论】:

      【解决方案3】:

      有一个列 [rowid][1] 负责每个 rowid

      典型 SQLite 数据库架构中的大多数表都是 rowid 表。 Rowid 表的区别在于它们都有一个唯一的、非 NULL、有符号的 64 位整数 rowid,用作底层 B 树存储引擎中数据的访问密钥。

      由于旧的 SQLite 版本不支持 ROW_NUMBER 窗口函数,您可以使用select 中的子查询来实现。

      您可以尝试使用关联子查询和UPDATE by rowid

      架构 (SQLite v3.18)

       Create table mytable (ID  INT, OrderID  INT, a  INT, b  INT);
      
          Insert into mytable (ID, OrderID,a,b) values (1, 1,1,1);
          Insert into mytable (ID, OrderID,a,b) values (1, 2,1,2);
          Insert into mytable (ID, OrderID,a,b) values (2, 1,1,3);
          Insert into mytable (ID, OrderID,a,b) values (2, 3,2,1);
          Insert into mytable (ID, OrderID,a,b) values (3, 1,2,3);
      
      
      update mytable 
      set orderid= 
      (
         SELECT (select count(*) 
                    from mytable tt
                   where tt.a > t1.a or
                      (tt.a = t1.a and tt.b >= t1.b)) rn
          FROM mytable t1
          where mytable.rowid=t1.rowid
      );
      

      查询 #1

      SELECT * FROM mytable order by OrderID;
      
      | ID  | OrderID | a   | b   |
      | --- | ------- | --- | --- |
      | 3   | 1       | 2   | 3   |
      | 2   | 2       | 2   | 1   |
      | 2   | 3       | 1   | 3   |
      | 1   | 4       | 1   | 2   |
      | 1   | 5       | 1   | 1   |
      

      View on DB Fiddle

      【讨论】:

      • 抱歉,您的查询似乎不包含 a 和 b,这将用于对结果进行排序。
      猜你喜欢
      • 2016-11-16
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多