【问题标题】:Update left join rows that didn't match更新不匹配的左连接行
【发布时间】:2011-08-31 22:14:44
【问题描述】:

问题:我想更新与左连接(或其他快速解决方案)不匹配的行。 初始目标:更新 mytable1 的记录,其中 state=0 并且(XOR!)列“a”与 mytable2 匹配,或列“b”与 mytable2 匹配(“a”和“b”不应同时匹配!)。将两个表的记录设置为 state=5。

我尝试过(但失败了):

update mytable1 as t1 
    left join mytable2 as t2 on (t1.a=t2.a and t1.b=t2.b) 
set t1.state=5,t2.state=5 
where t1.state=0 and t2.state=0 and t2.a is null;

如您所见,我尝试加入所有匹配 BOTH 值的记录,以便更新不匹配的记录,同时更新 mytable2 中不匹配的行。 mytable1 中的行得到更新,但 table2 中的行没有更新。我可以更新与左连接匹配的行,但这是我认为会影响性能的行的 99%(我确实问过这个问题,所以我从来没有比较过;)。

感谢您的宝贵时间。

【问题讨论】:

  • 如果 t2 中没有匹配的行,你想如何更新 t2.state?
  • 是的,所有与左连接不匹配但仍具有 state=0 的行(在两个表中!)都应该得到更新。 state!=0 的行不应在任一表中获得任何更新。感谢您的帮助,Benoit。

标签: mysql sql left-join sql-update


【解决方案1】:

应该这样做:

UPDATE `mytable1`
    JOIN `mytable2` ON `mytable1`.`state` = `mytable2`.`state`
        AND
        (
            (`mytable1`.`a` = `mytable2`.`a` AND `mytable1`.`b` != `mytable2`.`b`) OR 
            (`mytable1`.`b` = `mytable2`.`b` AND `mytable`.`a` != `mytable2`.`a`)
        )
SET `mytable1`.`state` = 5, `mytable2`.`state` = 5
WHERE `mytable1`.`state` = 0;

【讨论】:

  • 谢谢纳尔夫。我实际上有要比较的列“a”、“b”和“c”(我只是给了你一个例子),这产生了更多的条件。不过,我会尝试使用您在此处提供的信息,谢谢!
【解决方案2】:

这是我想出的:

update mytable1 t1 inner join mytable2 t2 on (t1.a=t2.a or t1.b=t2.b or t2.c=t1.c) set t1.state=5,t2.state=5 where((cast(t1.a=t2.a as unsigned integer) + (cast(t1.b=t2.b as unsigned integer) + (cast(t1.c=t2.c as unsigned integer)) <3) and t1.state=0;

是的,最多 2 个值可以相等,只有 1 个应该不同。

它看起来很有效,而且速度很快。有什么意见吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多