更新多个不同的列

时间:2019-05-02 11:48:37

标签: mysql sql

我试图一次更新多行,但只更新不同的行。

SQL代码: http://sqlfiddle.com/#!9/9c6bdd/4

从小提琴中的select语句可以看到-我想使用where和不同的条件来更新行。

更新应更改TOP 1(LIMIT 1)行的IDOrder值,其中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 个答案:

答案 0 :(得分:1)

修复数据模型,以便区分行:

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 :(得分:1)

您似乎要删除每批相同记录中的第一个。

永久解决方案是更改数据库结构以允许行的唯一性(第一种范式)。这是一种伪造,直到到达那里的方式。

此方法以每个idcinnost的最高示例为例,将其推入单独的表中。更新这些记录,在第一个表中找到最上面的示例,使用第三个表进行引用,从原始表中删除原始行,然后从第一个临时表中删除该行,然后从第二个临时表中删除。 / p>

笨拙,但总体效果有效,并提供您想要的输出。

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

答案 2 :(得分:0)

我会删除重复项,因此您可以尝试每种组合。