2016-06-20 2 views
0

다음과 같은 두 가지 이상의 쿼리를 결합 할 수 있습니까? 현재의 동작은 tableB의 두 번 테이블 스캔을 수행 할 것입니다. 그러면 조합 후에 tableB를 한 번 스캔하는 것이 좋습니다. 감사합니다. .여러 개의 업데이트 문을 결합하십시오.

update tableA A 
set A.column2=B.column3 
     from tableB B 
     where A.column1 = B.column1 
     B.column2=1111 
     and B.column3 is not null; 


update tableA A 
set A.column2=B.column4 
     from tableB B 
     where A.column1 = B.column1 
     and B.column2=2222 
     and B.column4 is not null; 
+0

여기에있는 것처럼 다른 조건에서 쿼리가 값을 설정할 수 있도록하려면 case 문을 사용합니다. 이것은 귀하의 문제와 유사합니다 : http://stackoverflow.com/questions/35533828/how-to-combine-two-update-queries-having-different-where-condition. – Dresden

+0

쿼리가 지금 읽기 때문에 tableA와 tableB 사이에 연결이 없습니다. 그 맞습니까? – nscheaffer

+0

@Dresden 사례 문장을 통해 "어디에서 선택 하시겠습니까?" –

답변

0

이 될 것이라고 SQL 서버 구문이 될 나는이 이상 교차 확신하지만 MySQL은 다른 구문을 제안 몇 가지 기사를 보았다. 그러나 기본적으로 join 또는 where 절을 사용하여 relate 테이블을 만든 다음 case 문을 사용하여 값을 선택하십시오. 아래의 솔루션에서는 case 문을 ELSE 절대로 사용하지 않지만 좋은 측정 값은 join과 일치하지만 현재 case 문 조건과 일치하는 항목의 현재 열 값을 참조합니다. A는 조인을 사용하지 않는 당신의 코멘트 당

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN b.Column2 
     WHEN b.Column1 = 2222 THEN b.Column3 
     ELSE a.Column1 
    END 
FROM 
    [DatabaseA].TableA a 
    INNER JOIN [DatabaseB].TableB b 
    ON a.Column4 = b.Column4 
    AND (
      (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
      OR 
      (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
     ) 

가입하여

.

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN (SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4) 
     WHEN b.Column1 = 2222 THEN (SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4) 
     ELSE a.Column1 
    END 
FROM 
    TableA 
WHERE 
    EXISTS (
     SELECT * 
     FROM 
      TableB 
     WHERE 
      b.Colmn4 = a.Column4 
      AND (
       (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
       OR 
       (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
      ) 

미친 것처럼 보이지만 의도 한 행만 업데이트됩니다. 그렇지 않으면 전체 열을 업데이트해도 상관 없으면 다음과 같이 할 수 있습니다. 당신은 전체 테이블을 갱신하고자하는 경우

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN ISNULL((SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 1111),a.Column1) 
     WHEN b.Column1 = 2222 THEN ISNULL((SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 2222),a.Column1) 
     ELSE a.Column1 
    END 
FROM 
    TableA 

당신은 하나의 부속와 함께 할 수도 있습니다. 이 모든 대답에

UPDATE a 
    SET Column1 = ISNULL(

     (  SELECT (CASE WHEN b.Column1 = 1111 THEN b.Column2 ELSE b.Column3 END) 
     FROM 
      TableB 
     WHERE 
      b.Colmn4 = a.Column4 
      AND (
       (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
       OR 
       (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
      ) 
     ),a.Column1)  
FROM 
    TableA 

트릭은 당신이 그렇지 않으면 당신이 의도 한 결과를 얻을 수 없습니다 TableA의와 TableB의의 SELECT 문을 연관시킬 수 있어야한다.

+0

MySQL에서는'FROM'을 제거하고 join 문을'UPDATE [TableA] INNER JOIN ... '과 같이 첫 줄로 옮깁니다. – Parfait

+0

안녕하세요 매트와 파르페, 도와 줘서 고마워! 이 방법은 mysql/sql에서 작동합니다. –

+0

나는 또 다른 방법은 다음과 같이되도록 문을 가입 제거 : 업데이트 할 때 b.Column1 = 1111 THEN b.Column2 언제 b.Column1 = 2222 THEN b.Column3 ELSE a.Column1 SET 열 1 = CASE 끝 에서 [데이터베이스 B].TableB의 B를 WHERE a.Column4 = b.Column4 AND ( (b.Column1 = 1111 b.Column2 그렇지 NULL) OR (b.Column1 = 2,222 AND b.Column3 그렇지 NULL)을 ) –

관련 문제