如何通过MySQL中另一列的所有值更新列的所有值

时间:2019-03-08 19:46:16

标签: mysql sql

假设我们的表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

4 个答案:

答案 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

这可行!