2011-08-31 7 views
0

문제점 : 왼쪽 조인 (또는 다른 빠른 솔루션)과 일치하지 않는 행을 업데이트하고 싶습니다. 초기 목표 : state = 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

가 여기에 내가 무엇을 최대 온의 :

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