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 เป็นต้นครับ

ลองใช้ดูครับ

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *