2011-08-31 4 views
0

問題:左結合(または別の高速解法)と一致しない行を更新したいと思います。 最初の目標:状態= 0で、mytable2と一致する(XOR!)列 "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%です(私はこの質問をしましたので比較することはできません)。

ありがとうございます。

+0

t2のどの行も一致しない場合、どのようにt2.stateを更新しますか? – Benoit

+0

はい左の結合と一致しないが、まだ状態= 0(両方の表で!)の行はすべて更新を取得する必要があります。 state!= 0の行はどちらのテーブルでも更新されません。助けてくれてありがとう、Benoit。 – AndrewBourgeois

答えて

0

ここに私が思い付いたものです:最大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; 

はい、唯一の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