PDA

View Full Version : انتخاب n تای m ام از جدول !



m_amin_t
چهارشنبه 18 فروردین 1389, 11:53 صبح
سلام
من میخوام مثلا 10 تای سوم از اطلاعات جدولم رو بیارم. مثلا من 105 تا رکورد توی جدولم هستش. حالا میخوام 10تای سوم (یعنی از 21 تا 30) رو برام بیاره. توجه داشته باشید که id های اطلاعاتم به ترتیب نیست مثلا ممکنه اینجوری باشه: 1 - 2 - 5 - 6 - 10 - ...

محمد سلیم آبادی
چهارشنبه 18 فروردین 1389, 12:30 عصر
SELECT *
FROM (SELECT *, row_id = (SELECT COUNT(*)
FROM table_name AS T1
WHERE T1.ID <= T2.ID)
FROM table_name AS T2) AS D
WHERE row_id BETWEEN 21 AND 30;


SELECT *
FROM (SELECT *, row_id = ROW_NUMBER() OVER(ORDER BY ID ASC)
FROM table_name) AS D
WHERE D.row_id BETWEEN 21 AND 30

programmer2010
چهارشنبه 18 فروردین 1389, 19:57 عصر
اگر بخوای با استفاده از Topهای تو در تو هم میشه اینکار رو کرد ولی خوب روشهای قبلی معقول و متداولتره.

محمد سلیم آبادی
چهارشنبه 18 فروردین 1389, 20:24 عصر
البته یک روش دیگه که خیلی هم متداول و رایج اینه که جدول رو با خودش JOIN کنیم تا بتونیم Rank هر سطر رو بدست آورده و در آخر فیلتر مورد نظرمون رو اعمال کنیم.

programmer2010
چهارشنبه 18 فروردین 1389, 20:27 عصر
البته یک روش دیگه که خیلی هم متداول و رایج اینه که جدول رو با خودش JOIN کنیم تا بتونیم Rank هر سطر رو بدست آورده و در آخر فیلتر مورد نظرمون رو اعمال کنیم.
این روش costش خیلی بالاست درست؟
یه روش هم استفاده از جداول موقت بود. که اونم کاست بالایی داشت ولی توی SQL2000 خیلی متداول و شاید بهترین راه بود.

محمد سلیم آبادی
چهارشنبه 18 فروردین 1389, 20:42 عصر
این روش costش خیلی بالاست درست؟
یه روش هم استفاده از جداول موقت بود. که اونم کاست بالایی داشت ولی توی SQL2000 خیلی متداول و شاید بهترین راه بود.

راجب Cost اش خبر ندارم چون امتحانش نکردم.
بله در 2000 روش متداول این بود که بیاییم از تابع IDENTITY یا خصیصه ی IDENTITY استفاده کنیم. ولی تا جایی که امکانش وجود داره برای Rank دادن از روش های set-based استفاده می شه.

http://www.30sharp.com/ShowArticle.aspx?nid=13&did=195&AuthorID=11

programmer2010
چهارشنبه 18 فروردین 1389, 23:00 عصر
من همیشه به cost توجه خاصی دارم. اگر کوئری رو بشه به چند صورت نوشت کوئری ها رو مینویسم و براساس پلن بهترین گزینه رو انتخاب میکنم..

محمد سلیم آبادی
چهارشنبه 18 فروردین 1389, 23:16 عصر
البته فراموش نکنین که Estimated Subtree Cost تنها فاکتور برای ارزیابی یک Query نیست. بلکه با ابزارهایی چون STATISTICS IO و TIME می شود از جنبه های دیگری به هزینه ی کوئری پی برد.

از طرفی Index Tuning می تونه سرعت کوئری ها را فوق العاده افزایش بده. مخصوصا EXISTS() predicate خوراکش INDEX هست (یا برعکس).

programmer2010
چهارشنبه 18 فروردین 1389, 23:39 عصر
ولی مهمترینش هست;:چشمک: