คำสั่ง Update โดยใช้ข้อมูลจากอีกตาราง [Oracle]

ในการสั่ง update ข้อมูล ในบางครั้งเราอาจจะเจอโจทย์ว่า ต้องการ update ข้อมูลในตารางหนึ่งโดยใช้ข้อมูลจากอีกตารางหนึ่ง ซึ่งลักษณะของข้อมูลทั้งสองตารางนี้ จะต้องมีฟีลด์ข้อมูลที่สามารถเชื่อมโยงความสัมพันธ์ของข้อมูลแต่ละเร็คคอร์ดได้

ตัวอย่างข้อมูล

  1. มีข้อมูลสองตาราง

ตารางที่ 1 เก็บข้อมูลวันในหนึ่งสัปดาห์ภาษาไทย [ชื่อตาราง : DAY_OF_WEEK_THAI]

โครงสร้างตารางประกอบด้วย

  • ฟีลด์ ID เก็บ ID ของแต่ละเร็คคอร์ด
  • ฟีลด์ DAY_FULL เก็บข้อมูลวันแบบเต็มภาษาไทย
  • ฟีดล์ DAY_SHORT เก็บข้อมูลวันแบบย่อภาษาไทย

ข้อมูลในตารางเป็นดังนี้

ตารางที่ 2 เก็บข้อมูลวันในหนึ่งสัปดาห์ภาษาอังกฤษ [ชื่อตาราง : DAY_OF_WEEK]

โครงสร้างตารางประกอบด้วย

  • ฟีลด์ ID เก็บ ID ของแต่ละเร็คคอร์ด
  • ฟีลด์ DAY_ENG เก็บข้อมูลวันแบบเต็มภาษาอังกฤษ
  • ฟีดล์ DAY_ENG_SHORT เก็บข้อมูลวันแบบย่อภาษาอังกฤษ

ข้อมูลในตารางเป็นดังนี้

2. ฟีลด์ที่เชื่อมโยงความสัมพันธ์ของทั้งสองตารางคือฟีลด์ ID

3. ต่อมามีการปรับแก้โครงสร้างตาราง DAY_OF_WEEK โดยเพิ่มฟีลด์ 2 ฟีลด์ ดังนี้

ฟีลด์ DAY_THA สำหรับเก็บข้อมูลวันแบบเต็มภาษาไทย

ฟีลด์ DAY_THA_SHORT สำหรับเก็บข้อมูลวันแบบย่อภาษาไทย

4. เนื่องจากมีข้อมูลวันภาษาไทยในตาราง DAY_OF_WEEK_THAI อยู่แล้ว และสามารถเชื่อมโยงข้อมูลกันได้ด้วยฟีลด์ ID ดังนั้นความต้องการคือ การใช้ข้อมูลจากตาราง DAY_OF_WEEK_THAI มา update ให้กับตาราง DAY_OF_WEEK

5. รายละเอียดการ update

นำข้อมูลวันแบบเต็มภาษาไทยในฟีลด์ DAY_FULL ของตาราง DAY_OF_WEEK_THAI มาใส่ในฟีลด์ DAY_THA ของตาราง DAY_OF_WEEK

นำข้อมูลวันแบบย่อภาษาไทยในฟีลด์ DAY_SHORT ของตาราง DAY_OF_WEEK_THAI มาใส่ในฟีลด์ DAY_THA_SHORT ของตาราง DAY_OF_WEEK

รูปแบบคำสั่ง SQL

แบบที่ 1

update table1 t1 set

table1.data1= (select table2.data1 from table2 where table2.key = t1.key),

table1.data2 = (select table2.data2 from table2 where table2.key = t1.key);

แบบที่ 2

update table1 t1 set

(table1.data1, table1.data2) =

(select table2.data1, table2.data2 from table2 where table2.key = t1.key);

อธิบายคำสั่ง

table1 คือ ตารางที่ต้องการ update

t1 คือ ชื่ออ้างอิงแทนตาราง table1 ซึ่ง t1 จะถูกใช้ในคำสั่ง select

table1.data1 และ table1.data2 คือ ฟีลด์ข้อมูลที่ต้องการ update

table2 คือ ตารางที่จะนำข้อมูลมาใช้เพื่อ update ให้กับ table1

table2.data1 และ table2.data2 คือ ฟีลด์ข้อมูลที่จะนำมาใช้เพื่อ update ให้กับ table1.data1 และ table1.data2 ตามลำดับ

ตัวอย่างการนำไปใช้งาน

แบบที่ 1

update day_of_week t1 set
day_tha = (select day_full from day_of_week_thai where day_of_week_thai.id = t1.id),
day_tha_short = (select day_short from day_of_week_thai where day_of_week_thai.id = t1.id);

แบบที่ 2

update day_of_week t1 set
(day_tha, day_tha_short) =
(select day_full, day_short from day_of_week_thai where day_of_week_thai.id = t1.id);

ผลลัพธ์การรันคำสั่งทั้งสองรูปแบบ จะได้ผลลัพธ์เช่นเดียวกัน ดังรูป

ข้อมูลก่อน update

ข้อมูลหลัง update

สรุป

  1. สามารถใช้คำสั่ง update ได้ทั้งสองรูปแบบซึ่งจะได้ผลลัพธ์เหมือนกัน
  2. แบบที่ 2 จะเป็นการใช้คำสั่งที่สั้นและกระชับกว่าแบบที่ 1 มาก กรณีที่ข้อมูลที่ต้องการ update มีมากกว่า 1 ฟีลด์
  3. ข้อควรระวังคือ ความสัมพันธ์ระหว่างสองตารางต้องเป็น 1 ต่อ 1 จึงจะสามารถใช้คำสั่งรูปแบบนี้ได้