Я пытаюсь обновить несколько строк одновременно, но только отдельные строки.

Код 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
Lukáš Pomykal 2 Май 2019 в 14:48

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;
1
Gordon Linoff 2 Май 2019 в 11:53

Похоже, вы хотите удалить первый из каждой партии идентичных записей.

Хотя постоянное решение состоит в том, чтобы изменить структуру базы данных, чтобы обеспечить уникальность строк (первая нормальная форма). Это способ подделать это, пока вы не получите там.

Этот подход берет верхний пример каждой 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;

enter image description here

1
Dwight Reynoldson 2 Май 2019 в 12:12

Я бы удалил дубликаты, так что у вас есть одна попытка для каждой комбинации.

0
BubbaKush 2 Май 2019 в 11:53