ฟังก์ชันการรวมในแบบสอบถามการอัปเดต SQL?


98

ฉันกำลังพยายามตั้งค่าในตารางหนึ่งเป็นผลรวมของค่าในตารางอื่น บางสิ่งตามบรรทัดเหล่านี้:

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

แน่นอนว่านี้ยืนก็จะไม่ทำงาน - SETไม่สนับสนุนและไม่สนับสนุน SUMGROUP BY

ฉันควรจะรู้ แต่ใจของฉันมันว่างเปล่า ผมทำอะไรผิดหรือเปล่า?


คำถามที่ดี ... ฉันหวังว่าฉันจะโหวตได้มากกว่าหนึ่งครั้ง
โจ

คำตอบ:


150
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
สำคัญ: ระวังว่าเขตข้อมูลใดที่คุณจัดกลุ่มอาจเป็นค่าว่างได้ (เช่น field3 ด้านบน) คุณต้องแก้ไข "เข้าร่วม" เพื่อบัญชีนี้มิฉะนั้นผลรวมของคุณจะไม่ถูกต้อง ( 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 ดังนั้นการเข้าร่วมดำเนินการเบื้องหลังจึงทำงานไม่ถูกต้อง (ฉันมั่นใจว่ามีส่วนร่วมอยู่เบื้องหลัง)
โจ

5

หรือคุณสามารถใช้คำตอบของJBrooksและOMG Ponies :

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

16
ฉันวางคำค้นหาสามรายการไว้เคียงข้างกันและดำเนินการตามแผนการดำเนินการ คำตอบนี้มีค่าใช้จ่าย 51%
Margaret

โอกี้โดกี้! และขอบคุณสำหรับคำติชม ฉันจะเพิ่มลงในกล่องเครื่องมือของฉัน :-)
Paulo Santos

นั่นอาจเป็นเพราะคุณใช้ SUBQUERY ที่ต้องเริ่มการทำงานของ SUM () ทุกแถวที่ถูกต้องแม้จะใช้เครื่องมือเพิ่มประสิทธิภาพ
ก็ตาม


3

ฉันรู้ว่าเป็นคำถามที่ติดแท็ก SQL Server แต่ต้องระวังเกี่ยวกับการปรับปรุงกับ JOIN ถ้าคุณกำลังใช้PostgreSQL คำตอบของ @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  

ดูพารามิเตอร์from_listในเอกสารเพื่อดูสาเหตุที่FROMPostgreSQL พิจารณาว่าเป็นการเข้าร่วมด้วยตนเอง: 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.