Mysql 更新多个不同的列
我试图一次更新多行,但只更新不同的行 SQL代码: 正如您从FIDLE中的select语句中所看到的,我希望使用where和distinct条件更新行 Update应更改TOP 1 LIMIT 1行的IDOrder值,其中GroupP相同 例如:Mysql 更新多个不同的列,mysql,sql,Mysql,Sql,我试图一次更新多行,但只更新不同的行 SQL代码: 正如您从FIDLE中的select语句中所看到的,我希望使用where和distinct条件更新行 Update应更改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
(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),
修复数据模型,以便可以区分行:
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;
您的行完全相同。我认为没有一种方法可以在不向表中添加另一列的情况下执行您想要的操作。为什么不删除重复项,这样每个组合只有一行?您需要添加主键。。。或者任何类型的键来唯一地标识行。不幸的是,这是不可能的。自动生成这些行的原因是:谢谢,但是。。。是否可以像在输出中看到的那样,在同一上传中更改两个不同行中的值?其思想是:我想将IDOrder值更新到一个GroupP记录的所有前1行,而不使用某些过程,仅使用update语句。因此,对于不同的IDCinnot和相同的IDPobocka,GroupP的每个前1行都将更新IDOrder值。可能吗?解决了,谢谢你给我指路。不带WHERE条件的解决方案:更新WC_Kalendar_Terminu t1内部连接选择IDCINNostanapoBocce,MINID作为min_id来自WC_Kalendar_Terminu内部连接WC_CINNOST_NA Bocce ON IdcinosnostNa Bocce=WC_CINNOST_NA Bocce.id_W_CINNOST_NA Bocce组,由IdcinosnostNapocce t2在t1.IdcinosnostNapocce=t2.IdcinosnostNapocce=t1.id内部连接WC_CinnostNa BocceWC_CINNOST_NA_POBOCCE.ID_W_CINNOST_NA_POBOCCE集合t1.IDObjednavka=1234