【问题标题】:Update query with multiple tables and limit option使用多个表和限制选项更新查询
【发布时间】:2020-01-29 10:20:55
【问题描述】:
Update table2 t2
set t2.c1=t1.c1
inner join table1 t1 on ( t1.c2 = t2.c2)
where t2.c1 = "-1";

我想执行上面的查询,该查询将从table1 列更新table2 列ON INNER JOIN 匹配条件。它工作正常。我正在运行一个迁移,其中两个表中的行数都以百万为单位。我想过批量限制更新查询以进行查询优化,但更新查询中不允许限制。

我可以尝试使用带限制选项的选择查询,但更新多列不适用于下面的查询。

update table2 t2
set t2.c1=<?>
where t1.c2 = ( select c2 from table);

谁能帮助使用更新查询进行优化?更新数百万行会有影响吗?

【问题讨论】:

  • MySQL SQL Server;您真正使用的是什么 RDBMS?该初始语句不是有效的 T-SQL,所以我假设前者。
  • @Larnu 很抱歉让您感到困惑。我正在使用 MySQL

标签: mysql sql sql-update


【解决方案1】:

您可以将limiting 子句移动到连接表中,如下所示:

update table2 t2
inner join (
    select c1, c2
    from table1
    order by c2
    limit ?, ?
) t1 on t1.c2 = t2.c2
set t2.c1 = t1.c1
where t2.c1 = -1

【讨论】:

  • 谢谢您的回答。它返回我一个错误 MySQL 服务器版本,以便正确的语法在 'inner join ( 附近使用确切的查询。另外,你能否解释一下这个 select c1,c2 如何与内部连接一起工作以供我理解?
  • @MarkWaugh:抱歉,出现了语法问题(set 子句出现在 join 之后) - 在您的原始查询中已经出现了错误。
  • 子查询选择table1的有限子集,然后将结果与外部表连接以进行更新。您可以使用调整问号来批量执行更新。
  • 它正在工作:-) 子查询结果被视为 t1 结果,它将与 t2 进行内部连接。我对吗?顺便说一句,这对我来说是新的。
【解决方案2】:

我不确定您真正想要做什么,但您可以使用updatelimit 更新多个列。

以下是好的:

update table2 t2
    set t2.c1 = <?>,
        t2.c3 = ?
    where t1.c2 = ( select c2 from table)
    limit 100;

【讨论】:

  • 1.您提到的 LIMIT 100 将适用于 mysql 不允许的 UPDATE 查询(如果我错了,请纠正我)。 2. t2.c1=> 这个值是从 t1.c1 获取的,你的查询没有这样的东西。 3. 提到的 WHERE 条件是更新到单行,这不会像我说的那样工作,并且正在寻找匹配条件为 2 个表的批量更新行。
  • @MarkWaugh 。 . . MySQL 确实支持LIMIT 中的UPDATE——但不支持JOIN。如果值来自另一个表,则此方法不起作用。
  • 很好。我想用条件与限制选项匹配的 table1 列更新 table2 列(优化限制)。请你指导我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多