我试图一次更新多行,但只更新不同的行。
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),
答案 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;
答案 2 :(得分:0)
我会删除重复项,因此您可以尝试每种组合。