Обновить строки левого соединения, которые не совпадают - PullRequest
0 голосов
/ 31 августа 2011

Проблема: я хотел бы обновить строки, которые не соответствуют левому соединению (или другому быстрому решению). Начальная цель: обновить записи mytable1, которые имеют состояние = 0 и имеют (XOR!) Столбец «a», который соответствует mytable2, или столбец «b», который соответствует mytable2 («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% строк, что, я думаю, было бы ударом по производительности (я задавал этот вопрос, поэтому мне никогда не удавалось сравнивать;).

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Вот что я придумал:

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 голосов
/ 31 августа 2011

Что-то вроде этого должно сделать это:

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;
...