อัปเดตคอลัมน์ด้วยข้อมูลจากตารางอื่น


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) จากนั้นใช้ค่าจากแถวที่กำหนดเองเพื่ออัปเดตแถวของตาราง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.