假设我们的表t1如下所示:
Name | ID -----+---- Jill | 850 Eve | 851 John | 852
下面的表t2
New_ID ------ 950 951 952
如何通过t2中的相应ID有效地更新t1中的所有ID?我们可以假设两个表的行数相等。最终结果将类似于:
Name | ID -----+---- Jill | 950 Eve | 951 John | 952
答案 0 :(得分:1)
如果为两个表都计算了row_number,则可以使用它来联接它们。
在MySql 5.7中,您可以使用变量来计算row_number。
示例:
UPDATE t1
JOIN
(
SELECT ID, @rn1 := @rn1 + 1 as rn
FROM (select ID from t1 order by ID) data
CROSS JOIN (select @rn1 := 0) init
) q1 ON q1.ID = t1.ID
JOIN
(
SELECT ID, @rn2 := @rn2 + 1 as rn
FROM (select ID from t2 order by ID) data
CROSS JOIN (select @rn2 := 0) init
) q2 ON q2.rn = q1.rn
SET t1.ID = q2.ID;
在MySql 8中可以简化
UPDATE t1
JOIN
(
SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS rn
FROM t1
) q1 ON q1.ID = t1.ID
JOIN
(
SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS rn
FROM t2
) q2 ON q2.rn = q1.rn
SET t1.ID = q2.ID;
顺便说一句,两个样本表之间似乎有100的恒定差,没有任何间隙。
因此,仅加100就会得到与该样本相同的结果。
UPDATE t1 SET ID = ID + 100;
答案 1 :(得分:0)
这回答了问题的原始版本。
您可以使用join
进行更新:
update t1 join
t2
on t1.name = t2.name
set t1.id = t2.id;
答案 2 :(得分:0)
如果您没有相等的列,我认为这样做会更好。
按照自己的方式创建表,并枚举为新表。
create TEMPORARY table temp_table1(
Name varchar(10),
ID int
)
insert into temp_table1(Name,ID)
values ('Jill' , 850),
('Eve',851),
('John',852);
create TEMPORARY table temp_table2(
ID int)
insert into temp_table2(ID)
values (950),
(951),
(952);
create TEMPORARY new_temp1 IF NOT EXISTS AS (select Name, ID,row_number() over (order by ID) as Numb from temp_table1);
create TEMPORARY new_temp2 IF NOT EXISTS AS (select ID,row_number() over (order by ID) as Numb from temp_table2) ;
然后您可以使用while循环更新ID
declare n int;
set n = 1;
declare total_count int;
set total_count = (select count(*) from new_temp2 );
while n <= total_count
Do
update new_temp1
set ID = (select ID from new_temp2 where new_temp2.Numb = n)
where Numb = n;
set n = n + 1
end while;
alter table new_temp1
drop column Numb;
select * from new_temp1
答案 3 :(得分:0)
这对我有用。
按照@LukStorms的建议,我创建了两个临时表,为每个表生成行号。然后,我在创建的行号列上加入了两个临时表。
然后我使用以下查询来更新值(由Gordon建议):
update t1 join
t2
on t1.NUMB = t2.NUMB
set t1.id = t2.id;
请注意,在MySql中,没有ROW_NUMBER()函数的实现。但可以通过以下示例进行仿真:
SET @row_number = 0;
SELECT
(@row_number:=@row_number + 1) AS num, firstName, lastName
FROM employees
这可行!