SQL Tips : How to limiting result rows (Many Databases Platform)
SQL Tips : How to limiting result rows (Many Databases Platform)
สวัสดีครับ พบกันอีกเช่นเคย วันนี้มี Tips เล็กๆมาฝากเกี่ยวกับการใช้ SQL Statment พอดีต้องทำงานส่ง (ซึ่งจริงๆก็มอบหมายให้น้องเป็นมือหลัก ผมเป็นมือรอง) แล้วติดปัญหาเรื่องการตัดข้อมูลจากตารางที่มีจำนวนข้อมูลมากๆ
เช่น มีตารางข้อมูลจำนวน 10,000,000 records ซึ่งผมต้องนำส่งข้อมูลนี้ผ่านเครือข่ายเน็ตเวิร์กไปยังอีกหน่วยงาน โดยลิงค์ปกติที่ใช้อยู่ขนาดไม่ใหญ่จึงไม่สามารถส่งไปรวดเดียวได้ วิธีการของเราคือ จะซอยข้อมูลออกเป็นส่วนๆ แล้วทยอยส่งไป สมมติตัดส่งไปทีละ 100,000 ก็จะตัดส่งไปทั้งหมด 100 รอบ
ครับมาถึงตรงนี้ ก็เจอปัญหาเพราะว่าต้องทำกับ database หลาดยี่ห้อ อย่าง Oracle, MySQL, SQLServer2005 แล้วคำสั่ง SQL ที่ใช้ก็ไม่เหมือนกัน ซึ่งสุดท้ายก็หาทางได้ ดังนี้ครับ
1. MySQL and PostgreSQL
select * from table_name limit begin_rowno_no_return , row_records_need ;
- begin_rowno_no_return = rowno ของข้อมูลบรรทัดที่ไม่ต้องการแสดงผล
- row_records_need = จำนวนข้อมูลที่ต้องการให้แสดงผล
Example: Table TEST1 has 10 records, เราต้องการแสดงผล record ที่ 5 – 10 จะต้องเรียกดังนี้
select * from TEST1 limit 4,6
2. Oracle
โจทย์เดียวกันนะครับ เราใช้วิธีนี้
select * from (select rownum myrow, a.* from TEST1 a )
where myrow between 5 and 10 ;
Tips : ก็คือการใช้ rownum เหมือนกัน แต่ว่าเราไม่สามารถเอา rownum มาทำ between ได้ ก็เลยต้องซ้อน SQL ด้วยการแปลงชื่อเป็น myrow ก่อนแล้วค่อยเอา myrow มา between อีกที
3. SQLServer
โจทย์เดียวกัน
select ROW_NUMBER() OVER ( order by column_name_need_order ) as myrow,
column1, column2, …
from TEST1
where myrow between 5 and 10 ;
เท่านี้เราก็สามารถตัดข้อมูลออกมาเช่นชุดๆแล้วครับ ซึ่งการจะทำ Loop ตัดข้อมูลส่ง ผมต้องเอาไปประยุกต์ต่อ โดยเปลี่ยนเป็นตัวแปร หรือไม่ก็สร้างเป็นตารางเก็บค่า row_begin, row_end, Send_count เป็นต้นครับ
ลองใช้ดูครับ