根据先前查询的结果集更新百万行

时间:2014-07-08 05:49:08

标签: mysql sql

我需要更新一个包含百万行的表

有两个表table1和table2

SELECT ID
FROM (
select ID from table1 where<condition>
) as result1
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion>

并且在这个@ resultset1 ID上,我必须更新表1

UPDATE table1
SET x=true
where ID EXISTS IN (@resultset1)

两个表中都有数百万行。我该怎么做?

任何人都可以说这有什么不对,我正在尝试一些替代加入

UPDATE table1 t1
SET x=true
WHERE <condition> AND EXISTS(
    SELECT* FROM (
        SELECT *
        FROM table2 t2
        WHERE t2.field =  t1.field 
    ) AS result 
WHERE<condition on resultset field>
);

2 个答案:

答案 0 :(得分:0)

为什么你不能像下面这样做。如果这是您的实际查询,我确实不需要提供group byhaving

UPDATE table1
SET x=true
where ID IN (
SELECT ID
FROM (
select ID from table1 where<condition>
) as result1
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion>
)

另一个不错的选择是JOIN两个结果集并执行UPDATE之类的

UPDATE table1 t1
JOIN 
(
SELECT ID
FROM (
select ID from table1 where<condition>
) as result1
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion>
) X ON t1.ID = X.ID
SET t1.x=true

修改

您还可以将第一个查询的结果存储在临时表中(如a_horse_with_no_name所示),然后使用临时表的JOIN进行更新。 Somethig如下所示

create temporary table idtemp(ID INT);

insert into idtemp
SELECT ID
FROM (
select ID from table1 where<condition>
) result1
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion>

最后进行更新,如

UPDATE table1 t1
JOIN idtemp it ON t1.ID = it.ID
SET t1.x=true

答案 1 :(得分:0)

  1. 将第一个查询的结果输出到文件。
  2. 将输出转换为update语句,每个id更新一次(使用sed或其他)
  3. 将语句拆分为单独的文件,可能每个文件1000个(使用拆分或其他)
  4. 将每个文件作为sql脚本运行,每次执行之间暂停(例如10秒)(允许日志更新等并传播负载),使用简单的运行脚本循环文件