다른 테이블의 데이터로 열 업데이트


11

복잡한 문제에 대해 연구하고 있지만이 문제로 단순화합니다.

나는 두 개의 테이블이

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

세 번째를 업데이트하고 싶습니다.

C [ID, column1, column2,column3] 

이 쿼리를 사용하여 다른 세 번째 테이블을 업데이트하고 있습니다.

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A, B limit 1; ) as t ; 

나는 얻었다 :

UPDATE 0

이 쿼리를 실행할 때 :

select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab 
            from A, B limit 1; 

나는 결과를 얻었다. 뭔가 빠졌습니까?

샘플 데이터 : http://sqlfiddle.com/#!15/e4d08/5

답변:


19

올바른 형식은 다음과 같습니다 (정보 부족으로 현재 pg 버전 9.3을 가정).

UPDATE C 
SET    column1 = A.column1 
     , column2 = B.column2 
     , column3 = A.column1 + B.column2
FROM   A
JOIN   B ON A.id = B.id  -- ??? not specified in question!
WHERE  C.id = A.id      --  ??? not specified in question!
AND   (C.column1, C.column2, C.column3) IS DISTINCT FROM
      (A.column1, B.column2, A.column1 + B.column2);

마지막 WHERE절은 아무것도 변경되지 않는 빈 업데이트를 피하기 위해 선택 사항입니다 (그러나 여전히 전체 비용으로 새 행 버전을 작성하십시오).

ypercube는 이미 그의 의견에서 기본적인 설명을했습니다.

중복되지 않습니다. 파생 된 테이블은 교차 조인 A이고 B(즉, 조인 조건LIMIT 1 없이 ORDER BY) 임의의 행 ( 없이 ) 을 선택합니다 . 그런 다음 해당 임의 행의 값을 사용하여 table의 모든 행을 업데이트합니다 C. C의 다른 행에 다른 값을 사용하려면 3 개의 테이블을 조인해야합니다 (및를 사용 JOIN - ON하여 WHERE).

자세한 내용은 설명서 UPDATE를 참조하십시오.


0

당신은 이런 식으로해야합니다 :

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A
        join B  on ...
        where ... ) as t
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.