更新不匹配的左连接行

时间:2011-08-31 09:08:12

标签: mysql sql left-join sql-update

问题:我想更新与左连接(或其他快速解决方案)不匹配的行。 初始目标:更新mytable1的记录,其中state = 0且具有匹配mytable2的(XOR!)列“a”,或匹配mytable2的列“b”(“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%的行,这是我认为的性能命中(我确实问过这个问题所以我从来没有比较过;)。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

这样的事情应该这样做:

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;

答案 1 :(得分:0)

以下是我提出的建议:

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个不同。

它看起来很有效,而且很快。有评论吗?