Введение
Ниже я представляю два решения для решения проблемы и выполнения правильного UPDATE
.В конце каждого решения приведен живой пример с примерами данных.
Первый не требует ввода id
и работает для всей таблицывыбрав последний orderid
для каждого id
и изменив его flag
на 1
Секунда , требуется ввести id
иработает только для обновления одного id
при запуске
Я бы лично выбрал решение first , но я не уверен насчет вашего требования, поэтому выложил двавозможности.
Первое решение - обновить всю таблицу
Объяснение здесь, для прокрутки кода вниз.
Для этого мы будем использовать Значение строки конструкция (id, orderid)
точно так же, как для второго решения.Он найдет последнюю строку на основе orderid
и обновит только эту строку для данной пары (id, orderid)
.Более подробная информация об этом включена в Объяснение второго решения.
Нам также нужно будет смоделировать функцию row_number
, чтобы назначать номера ранжирования каждой строке, чтобы выяснить, какая строка имеет самую последнюю orderid
для каждой id
и пометьте тогда как 1
, чтобы иметь возможность получать только те, которые обновляются.Это позволит нам обновить несколько строк для разных идентификаторов в одном операторе.SQLite будет иметь эту функциональность , встроенную в версию 3.2.5 , но сейчас мы будем работать с подзапросом.
Для генерации номеров строк мы будем использовать это:
select
*,
(select count(*) from mytable m1 where m1.id = m2.id and m1.orderid >= m2.orderid) as rn
from mytable m2
Тогда нам просто нужно отфильтровать вывод по rn = 1
, и у нас есть то, что нам нужно.
Тем не менее, весь оператор UPDATE
будет выглядеть так:
Код
update mytable
set flag = 1
where (id,orderid) in (
select id, orderid
from (
select *, (select count(*) from mytable m1 where m1.id = m2.id and m1.orderid >= m2.orderid) as rn
from mytable m2
) m
where
m.rn = 1
and m.id = mytable.id
);
Live DEMO
Вот db fiddle , чтобы увидеть это решение вживую на данных выборки.
Второе решение - обновить только один идентификатор
Если вы знаете, что ваш ID
должен быть обновлен, и хотите выполнить оператор UPDATE
только для одного идентификатора, то это будет работать:
Код
update mytable
set flag = 1
where (id,orderid) in (
select id, orderid
from mytable
where id = 5
order by orderid desc
limit 1
);
Пояснение
(id, orderid)
- это конструкция, называемая Значение строки, для которого SQLite сравнивает скалярные значения слева направо.
Пример взят из документации:
SELECT (1,2,3) = (1,2,3) -- outputs: 1
Live DEMO
Вот дБfiddle , чтобы увидеть это решение вживую на данных выборки.