شماره ی سطر دادن به نتیجه ی Query
  خیلی مواقع احتیاج داریم به نتیجه ی Query شماره ی سطر دهیم.به برخی از تکنیک ها در این مقاله اشاره خواهد شد.
   SQL Server
   ۲۰۵۷۳
   این مقاله حاوی فایل ضمیمه نمی باشد
   محمد سلیم آبادی
   ۱۳۸۸/۱۲/۵
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

در بسیاری از مواقع احتیاج داریم که به هر سطر از نتیجه ی Query یک شماره بدهیم. بطور مثال در تکنیک Paging (صفحه بندی) این موضوع الازمی است.

نرم افزار SQL Server 2005 یکسری توابعی به نام Ranking را معرفی کرد که این کار را به سادگی و زیبایی انجام می دهد. در ادامه این موضوع در نسخه ی 2000 و 2005 مورد بررسی قرار خواهد گرفت.

نسخه ی 2000

برای اینکه درک مساله ساده تر شود از یک مثال استفاده خواهد شد. ابتدا یک متغیر جدول با یک ستون تعریف کرده و تعدادی سطر در آن انتشار داده می شود (توجه کنید که از آخرین Syntax نرم افزار SQL Server استفاده شده است)

 

DECLARE @t TABLE (i INT);
INSERT @t VALUES (1), (3), (4), (8);
SELECT * FROM @t;
/*
i
---
1
3
4
8
*/

 

روش اول: تابع IDENTITY INTO

 

SELECT *, IDENTITY (INT, 1, 1) AS ID
INTO #temp
FROM @t;

SELECT *
FROM #temp;

/*
i            ID
----------- -----------
1            1
3            2
4            3
8            4
*/

این تابع که همراه با ماده ی INTO استفاده می شود به نتیجه ی کوئری یک ستون IDENTITY اضافه کرده و نتیجه ی حاصل را در یک جدول جدید درج می کند. البته زمانی که از این روش به همراه ماده ی ORDER BY استفاده می کنیم تظمینی برای تولید ID های منظم و مرتب وجود نخواهد داشت. یعنی سطر اول ممکن است مقداری متفاوت با 1 داشته باشد و به همین ترتیب. می توانید به این مقاله ی KB مراجعه کنید.

 

روش دوم: خصیصه ی IDENTITY

 

DECLARE @table TABLE (i INT, ID INT IDENTITY);
INSERT INTO @table SELECT * FROM @t

SELECT * FROM @table
/*
i    ID
--- ----
1    1
3    2
4    3
8    4
*/
 

ابتدا یک متغیر جدولی با ساختار جدول اصلی و یک ستون اضافی با خصیصه ی IDENTITY تعریف نموده سپس با کمک دستور INSERT SELECT تمام سطرها جدول را در متغیر جدولی درج می کنیم.

 

نسخه ی 2005/2008

 

SELECT *, ID = ROW_NUMBER() OVER(ORDER BY i ASC)
FROM @t

تابع ROW_NUMBER بدون PARTITION به هر سطر از جدول یک شماره که از 1 آغاز شده و یکی یکی افزایش پیدا می کند خواهد داد. ترتیب نیز بر اساس صعودی ستون i خواهد بود.