Обновить несколько отдельных столбцов - PullRequest
3 голосов
/ 02 мая 2019

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

код SQL: http://sqlfiddle.com/#!9/9c6bdd/4

Как вы можете видеть из оператора select в скрипте - я хочу обновить строки, используя условия where и *.

Обновление должно изменить значение IDOrder для строки TOP 1 (LIMIT 1), где GroupP - то же самое

Пример:

(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 ]

1 голос
/ 02 мая 2019

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

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

Этот подход берет верхний пример каждой 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 голос
/ 02 мая 2019

Исправьте модель данных, чтобы вы могли различать строки:

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;
0 голосов
/ 02 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...