2011-08-31 31 views
0

問題:我想更新與左連接(或另一個快速解決方案)不匹配的行。 初始目標:更新mytable1的狀態爲0且具有匹配mytable2的(XOR!)列「a」或與mytable2匹配的列「b」(「a」和「b」不應同時匹配!)的記錄! 。將兩個表的記錄設置爲狀態= 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%的行,我認爲這會是一個性能問題(我曾問過這個問題,所以我從來沒有比較過;)。

謝謝你的時間。

+0

如果t2中沒有行匹配,你如何更新t2.state? – Benoit

+0

是的所有行都與左連接不匹配,但仍具有狀態= 0(在兩個表中!)應該得到更新。狀態爲!= 0的行不應在任何表中獲得任何更新。感謝您的幫助,Benoit。 – AndrewBourgeois

回答

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應該是不同的。

它看起來很有效,而且速度很快。任何意見?

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; 
+0

謝謝Narf。實際上我有列「a」,「b」和「c」來比較(我只是給了你一個例子),這使得更多的條件。儘管如此,我會嘗試使用您給出的信息,謝謝! – AndrewBourgeois