วิธีอัปเดตตารางจากตารางอื่น


28

ฉันมีหนึ่งตาราง A มีคอลัมน์ (id, field_1, field_2) และอีกตาราง B มีคอลัมน์ (id, field_2)

ตอนนี้ฉันต้องการรวมตาราง B ถึง A นั่นหมายความว่าฉันต้องการอัปเดต field_2 ในตาราง A เป็นมูลค่าของตาราง B ดังนั้นจะนำไปใช้อย่างไร BTW ฉันใช้ Oracle

ขอบคุณ


ทั้งสองตารางมีจำนวนระเบียนเท่ากันหรือไม่
ujjwalesri

คำตอบ:


29

แนวทางอื่นในการสืบค้นย่อยที่เกี่ยวข้อง (แนะนำโดย Kerri) คือการใช้คำสั่ง MERGE ซึ่งอาจมีประสิทธิภาพมากกว่าการเลือกย่อย (ซึ่งสามารถตรวจสอบได้โดยดูที่แผนการดำเนินการของทั้งสองคำสั่ง)

MERGE INTO table_b 
USING 
(
  SELECT id,
         field_2
  FROM table_a
) ta ON (ta.id = table_b.id)
WHEN MATCHED THEN UPDATE 
    SET table_b.field_2 = ta.field_2

2
ข้อ จำกัด เพียงอย่างเดียวของMERGEคำสั่งนี้คือคุณไม่สามารถอัปเดตคอลัมน์ที่เข้าร่วมได้นั่นคือคุณไม่สามารถอัปเดตคอลัมน์ที่ใช้ในส่วนONคำสั่งได้
Lalit Kumar B

สิ่งนี้ได้ผลสำหรับฉันอัปเดต 2.5 ล้านแถวกับการพยายามใช้วิธีสืบค้นย่อยซึ่งใช้เวลาประมาณ 45 นาทีก่อนที่จะเกิดข้อผิดพลาดด้วยORA-01555: snapshot too old
helmy

15

ไม่ว่าแน่ใจว่าสิ่งที่คุณหลังจากที่หนึ่งในนี้ แต่ควรทำงานเป็น one-off หรืออย่างต่อเนื่องผ่านทางงานที่กำหนดไว้:

UPDATE table_a a
   SET field_2 = ( SELECT field_2
                     FROM table_b b
                    WHERE b.id = a.id )
;

ตอนนี้ทุกครั้งที่มีการดำเนินการข้างต้นมันจะทำมันข้ามแถวทั้งหมดในตาราง หากนี่คือสิ่งที่คุณต้องทำตลอดเวลาฉันจะแนะนำอย่างอื่น แต่สำหรับตารางแบบครั้งเดียวหรือน้อยมากควรจะเพียงพอ


2

ฉันทำสิ่งนี้ได้สำเร็จโดยใช้หนึ่งตารางใน user1 จากอีกตารางหนึ่งใน user2:

update user1.table1 a
set a.field1 = (
  select b.field1
  from user2.table2 b
  where a.field1=b.field1
)
where <condition for update user1.table1>

1

คุณสามารถสร้างทริกเกอร์บน tableB ที่อัพเดท tableA ทุกครั้งที่ field_2 บน tableB ได้รับการอัพเดท ตรวจสอบที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้างทริกเกอร์ - http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#BABCIBBJ


ไม่ใช่คำตอบที่เกี่ยวข้อง
CleanBold
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.