SQL 업데이트 쿼리의 집계 함수?


98

한 테이블의 값을 다른 테이블의 값의 합계로 설정하려고합니다. 이 라인을 따라 뭔가 :

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3

물론 이것이 의미하는 것처럼 작동 SET하지 않습니다. 지원 SUM하지 않으며 지원하지 않습니다 GROUP BY.

나는 이것을 알아야하지만 내 마음은 공백을 그려 내고있다. 내가 뭘 잘못하고 있죠?


좋은 질문입니다. 한 번 이상 찬성 투표를 할 수 있으면 좋겠습니다.
Joe

답변:


149
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
   from table2
  group by field3) as t2
on t2.field3 = t1.field3  

41
세 가지 쿼리를 나란히 놓고 실행 계획을 실행했습니다. 이 답변의 비용은 5 %였습니다.
Margaret

우아하고 구현하기 쉬움 ... 하루 종일 어디에 있었습니까 ??? 나는 지금 한 시간 넘게 내 머리를 두드리는 중이다 :)
Ange1

1
중요 : 그룹화하는 필드가 nullable (예 : 위의 field3) 일 수 있는지 확인하십시오. 이를 설명하기 위해 'join'을 수정해야합니다. 그렇지 않으면 합계가 정확하지 않습니다 ( stackoverflow.com/a/14366034/16940 )
Simon_Weaver

10

사용하다:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)

14
세 가지 쿼리를 나란히 놓고 실행 계획을 실행했습니다. 이 답변의 비용은 44 %였습니다.
Margaret

t2.filed3이 table1.field2와 같은 이름이기 때문에 이것은 저에게 효과가 없었습니다. 그래서 뒤에서 수행 된 조인이 제대로 작동하지 않았습니다. (나는 무대 뒤에서 조인이 있다고 확신합니다)
Joe

5

또는 JBrooksOMG Ponies 답변을 혼합하여 사용할 수 있습니다 .

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1

16
세 가지 쿼리를 나란히 놓고 실행 계획을 실행했습니다. 이 답변의 비용은 51 %였습니다.
Margaret

Okie dokie! 그리고 피드백에 감사드립니다. 내 도구 상자에 추가하겠습니다. :-)
Paulo Santos

그 이유는 옵티 마이저를 사용하더라도 유효한 모든 행을 SUM ()을 실행해야하는 SUBQUERY를 사용하고 있기 때문입니다
clifton_h

4

CROSS APPLY를 사용하기에 좋은 상황

UPDATE t1
   SET t1.field1 = t2.field2Sum
  FROM table1 t1
 CROSS APPLY (SELECT SUM(field2) as field2Sum
                FROM table2 t2
               WHERE t2.field3 = t1.field3) AS t2

3

질문에 SQL Server 태그가 있다는 것을 알고 있지만 PostgreSQL을 사용하는 경우 JOIN으로 UPDATE에주의하십시오 . @JBrooks 답변이 작동하지 않습니다.

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (...) as t2
on t2.field3 = t1.field3  

다음 사항에 맞게 조정해야합니다.

UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3  

PostgreSQL에서 자체 조인으로 간주되는 from_list이유를 확인하려면 문서의 매개 변수 를 참조하십시오 FROM. https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

아래와 같이 CTE를 사용할 수도 있습니다.

;WITH t2 AS (
    SELECT field3, SUM(field2) AS field2
    FROM table2
    GROUP BY field3
)
UPDATE table1
SET table1.field1 = t2.field2
FROM table1
INNER JOIN t2 ON table1.field3 = t2.field3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.