Я пытаюсь обновить несколько строк одновременно, но только отдельные строки.
Код SQL: http://sqlfiddle.com/#!9/9c6bdd/4
Как вы можете видеть из оператора select в скрипте - я хочу обновить строки, используя условия where и условия.
Обновление должно изменить значение Заказа, для строки TOP 1 (LIMIT 1), где группа одинакова
Примере:
(IDPobocka, IDCinnost, Termin, IDOrder)
Вход:
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
Выход:
(1, 10,'2019-05-02 11:00:00', 1234),
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 10,'2019-05-02 11:00:00', NULL)
(1, 11,'2019-05-02 11:00:00', 1234),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
3 ответа
Исправьте модель данных, чтобы вы могли различать строки:
CREATE TABLE IF NOT EXISTS Test (
TestId int auto_increment primary key,
IDPobocka int,
IDCinnost int,
Termin datetime,
IDOrder int
);
Тогда вы можете просто сделать:
update t join
(select min(testid) as min_testid
from test t
group by IDPobocka, IDCinnost, Termin
) tt
on t.testid = tt.min_testid
set IDOrder = 1234;
Похоже, вы хотите удалить первый из каждой партии идентичных записей.
Хотя постоянное решение состоит в том, чтобы изменить структуру базы данных, чтобы обеспечить уникальность строк (первая нормальная форма). Это способ подделать это, пока вы не получите там.
Этот подход берет верхний пример каждой idcinnost, помещая это в отдельную таблицу. обновляет эти записи, находит верхний пример в первой таблице, использует третью таблицу для ссылки на нее, удаляет исходную строку из исходной таблицы, затем удаляет эту строку из первой временной таблицы, а затем удаляет ее из второй временной таблицы.
Это неуклюжий, но общий эффект работает и обеспечивает результат, который вы ищете.
declare @t table
(
IDPobocka int,
IDCinnost int,
Termin datetime,
IDOrder int
);
declare @r table
(
id int
);
insert @t (IDPobocka, IDCinnost, Termin, IDOrder)
values
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 10,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL),
(1, 11,'2019-05-02 11:00:00', NULL);
select * into #temp from
(select row_number()over(partition by idcinnost order by idpobocka) rowno, idpobocka, idcinnost, termin, idorder
from @t) tx where rowno=1;
update #temp set idorder=1234;
while exists (select 1 from #temp)
begin
delete top (1) t
output deleted.IDCinnost into @r
from @t t inner join #temp te on t.IDCinnost=te.IDCinnost;
insert @t (IDPobocka, IDCinnost, Termin, IDOrder)
select IDPobocka, IDCinnost, Termin, IDOrder from #temp t1 inner join @r r1 on t1.IDCinnost=r1.id;
delete t2 from #temp t2 inner join @r r2 on t2.IDCinnost=r2.id;
delete from @r;
end
drop table #temp;
select * from @t;
Я бы удалил дубликаты, так что у вас есть одна попытка для каждой комбинации.
Похожие вопросы
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.