簡體   English   中英

更新不匹配的左聯接行

[英]Update left join rows that didn't match

問題:我想更新與左聯接不匹配的行(或其他快速解決方案)。 初始目標:更新狀態為= 0且具有(xOR!)與mytable2匹配的列“ a”或與mytable2匹配的列“ b”(“ a”和“ b”不應都匹配!)的mytable1記錄。 將兩個表的記錄設置為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;

如您所見,我試圖合並所有兩個值都匹配的記錄,以便我可以更新不匹配的記錄,還可以更新mytable2中不匹配的行。 來自mytable1的行將被更新,但不會更新來自table2的行。 我可以更新與左聯接匹配的行,但這是行的99%,我認為這會對性能造成影響(我確實問過這個問題,所以我從來沒有進行比較;)。

感謝您的時間。

這樣的事情應該做到:

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;

這是我想出的:

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個可以不同。

看起來可行,而且速度很快。 任何意見?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM