Обновить OrderID на основе выбора Order By Results? - PullRequest
0 голосов
/ 03 октября 2018

Я использую 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);

Теперь, если я использую следующий оператор:

Выберите * из mytable ORDER BY desc,b desc;

Я получу все строки в другом порядке, как показано ниже:

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

Теперь я хочу обновить идентификатор заказа, чтобы порядковый номер строк отображался вышерезультаты следующие:

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

Как это сделать?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Существует столбец [rowid] [1], отвечающий за каждый идентификатор строки

Большинство таблиц в типовой схеме базы данных SQLite являются таблицами rowid.Таблицы Rowid отличаются тем, что все они имеют уникальный, не равный NULL, 64-разрядный целочисленный rowid со знаком, который используется в качестве ключа доступа к данным в базовом механизме хранения B-дерева.

Поскольку старая версия SQLite не поддерживала оконную функцию ROW_NUMBER, вы можете использовать подзапрос в select для его создания.

Вы можете попробовать использовать коррелированный подзапрос и UPDATE с помощью 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   |

Посмотреть на БД Fiddle

0 голосов
/ 03 октября 2018

Предполагая, что значения a и b являются уникальными:

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)
                  );
0 голосов
/ 03 октября 2018

Попробуйте: -

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

ОБНОВЛЕНИЕ mytable SET OrderID = ordNo FROM #TempTable WHERE mytable.ID = # TempTable.ID AND mytable.a = # TempTable.a AND mytable.b = # TempTable.b

...