ROW_NUMBER() in sql server 2005

ปกติเวลาที่เราต้องการ select ของโดยกำหนดไว้ว่าต้องไม่เกิน 10 row นะ ก็จะใช้

1
select top 10 * from table1

แต่ถ้าบอกว่า ต้องการ select ของโดยกำหนดว่า เอา row ที่ 10 – 20 เริ่มจะสงสัยละว่าทำอย่างไร เพราะ sql server กำหนดได้แค่ว่าไม่ให้เกินกี่ตัว แต่โชคดีที่ sql server 2005 มี ROW_NUMBER() ให้ใช้ (เพิ่งมีใน 2005) วิธีใช้ก็ตามนี้เลยครับ

1
2
3
4
select ROW_NUMBER() OVER(order by ViewId asc) as ROW_NUMBER
, ViewId
, TopicShow
from mView

sql ด้านบนนี้จะได้เลขของ row มา ทำให้เราสามารถทำ sub query เพื่อเลือกเฉพาะ row ที่เราต้องการได้

1
2
3
4
5
6
7
8
select *
from (
select ROW_NUMBER() OVER(order by ViewId asc) as ROW_NUMBER
, ViewId
, TopicShow
from mView ) as news
where ROW_NUMBER > 10
and ROW_NUMBER <= 20

เพิ่มเติมอีกเล็กน้อย เพื่อทำให้ query รวดเร็วยิ่งขึ้น จาก sql ข้างบนจะเห็นว่า sub query จะ select ของทุกอย่างใน table ก่อน แล้วค่อยให้ query ด้านนอก filter อีกครั้ง ซึ่งเปลือง process พอสมควร จึงแก้ไขด้วยการใส่ top 20 ลงไปใน sub query เพื่อลด process กันหน่อย

1
2
3
4
5
6
7
8
select *
from (
select top 20 ROW_NUMBER() OVER(order by ViewId asc) as ROW_NUMBER
, ViewId
, TopicShow
from mView ) as news
where ROW_NUMBER > 10
and ROW_NUMBER <= 20

ใครเข้ามาอ่านแล้วเห็นว่ามีประโยชน์ก็ comment หน่อยนะคับ (หาเสียงกันสุดๆ ^ ^)
ไว้พบกันใหม่กับ post ต่อไป
ถ้าไม่พบปัญหา คงไม่ได้มาเขียนบทความให้อ่านแน่ๆเลย >.<