===== ดู SQL ให้ผมหน่อยครับ =====
มี table อยู่สอง table ที่มี schema เหมือนกันเป๊ะ ๆ แต่ละ table มี 4 fields เป็น CHAR ขนาดต่าง ๆ 4 fields ที่ว่าคือ ID NAME SNAME และ PID สำหรับเก็บ รหัสพนักงาน ชื่อ นามสกุล และ เลขประจำตัวประชาชน ตามลำดับ ไม่มี key
ตารางแรก EMO (ย่อมาจาก EMPLOYEE OLD) เป็นตารางเก่า ที่มี DATA ที่ไม่ค่อย clean กล่าวคือ ซ้ำกันก็มี บางช่องหายไปบ้างก็มี เพราะว่า ไม่มีการกำหนด key และไม่มีการบังคับว่าแต่ละ field เป็น null ไม่ได้
ตารางที่สอง EMN (แน่นอนย่อมาจาก EMPLOYEE NEW) ตารางนี้ DATA ที่มี clean มาก ๆ คือแม้ว่า จะไม่มี key ก็ตาม แต่ว่า ID ก็ unique และแน่นอน PID ซึ่งเป็นเลขตามบัตรประชาชนก็ unique เช่นกัน
จุดประสงค์ของงานก็คือ เอาเจ้า EMN ไปทับ EMO นั่นเอง ง่ายๆ ไม่ยุ่งยาก แต่ก่อนที่จะเอาไปทับ ก็อยากจะตรวจสอบข้อมูล และแยกแยะข้อมูลก่อน กล่าวคือ ข้อมูลใดที่ ID มีใน EMN แต่ไม่มีใน EMO ก็จะเอาไป insert ทับได้เลย อันนี้ไม่มีปัญหา ง่ายมาก
อันที่สอง ถ้าข้อมูล มีทั้งใน EMN และ EMO ก็ให้ update ทับไปอีกน่ะแหละ โดยข้อมูลเก่า กับข้อมูลใหม่ ต้องมี id name sname เท่ากัน และ id ในข้อมูลเก่าต้อง ไม่ซ้ำซ้อนกันเองด้วย ก่อน update ผมก็ให้มัน select record ที่ผมสนใจมาก่อน ด้วยคำสั่ง
select a.id, a.name, a.sname, a.pid from EMN as a, EMO as b where a.id in (select id from EMO group by id having ( count(id) = 1 )) and a.id = b.id and a.name = b.name and a.sname = b.sname
ปัญหาคือ มันนานเหลือเกิน ใช้เวลาตั้ง 20 นาทีได้ ทั้ง ๆ ที่แต่ละ table มีข้อมูลทั้งหมด อยู่ประมาณ 20,000 records เท่านั้นเอง
แสดงว่า SQL statement ของผม เขียนได้ไม่ฉลาดเท่าไหร่ มีวิธีที่ฉลาดกว่านี้ไหมครับ
จากคุณ :
Khun_Horm
-[
27 ส.ค. 50 - 10:20:50
]
|