ورود

View Full Version : دستور خواندن سطر n ام چیست؟



ameysams
چهارشنبه 28 آذر 1386, 02:34 صبح
با سلا م خدمت دوستان عزیز دستور خواندن سطر n ام از یک جدول چیست ؟
متشکرم

Cave_Man
چهارشنبه 28 آذر 1386, 07:04 صبح
به نظر من اول n سطر اول رو بگیر
بعد ترتیب رو عوض کن ORDER BY و سطر اول رو بگیر

Alireza Orumand
چهارشنبه 28 آذر 1386, 09:30 صبح
سلام
راه حل بالا امکان پذیره ولی کمی سربار داره. راه های مختلفی میشه پیشنهاد داد ولی در شرایطی که برای ما این اهمیت داره که یک رکورد با شماره ای خاص خونده بشه به نظر بنده منطقی تره که به هر رکورد شماره ای اختصاص داده بشه و وقتی رکوردی با شماره ی خاصی مورد نظر ما بود خیلی راحت با چک کردن یه شرط ساده میتونیم به اون رکورد برسیم.
موفق باشید.

reza_rad
چهارشنبه 28 آذر 1386, 09:35 صبح
اگه از sql server 2005 استفاده می کنید می تونید به راحتی از row_number استفاده کنید:
http://msdn2.microsoft.com/en-us/library/ms186734.aspx

Alireza Orumand
چهارشنبه 28 آذر 1386, 13:00 عصر
سلام جناب راد
سوال دوستمون این بود که مثلا چطور میشه سطر شماره 30 رو انتخاب کرد. برداشت من از تابعی که شما معرفی کردید اینه که این تابع فقط شماره سطر جاری رو به ما برمیگردونه یعنی اگر ما رکورد شماره 30 رو نیاز داشته باشیم باید اول 30 تا رکورد رو همونطور که آقای CAVE_MAN گفتن انتخاب کنیم حالا با روشی که شما فرمودید شماره هر سطر رو معلوم کنیم و بعد دوباره شرط رو تو یه select دیگه چک کنیم تا به رکورد شماره 30 برسیم. و این به نظر من باز هم سربار داره.
مثال خود Books Online برای این تابع اینه


USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0

که نتیجه ی زیر رو برمیگردونه


Shelley Dyck 1 5200475.2313 98027
Gail Erickson 2 5015682.3752 98055
Maciej Dusza 3 4557045.0459 98027
Linda Ecoffey 4 3857163.6332 98027
Mark Erickson 5 3827950.238 98055
Terry Eminhizer 6 3587378.4257 98055
Michael Emanuel 7 3189356.2465 98055
Jauna Elson 8 3018725.4858 98055
Carol Elliott 9 2811012.7151 98027
Janeth Esteves 10 2241204.0424 98055
Martha Espinoza 11 1931620.1835 98055
Carla Eldridge 12 1764938.9859 98027
Twanna Evans 13 1758385.926 98055

من چیزی بیشتر از این متوجه نشدم. آیا میشه از این تابع طوری استفاده کرد که مثلا بگیم رکورد شماره 1000 رو به ما برگردون یا نه فقط به همین شکل این تابع شماره رکورد ها رو به ما میده و ما باید خودمون رکورد مربوطه رو پیدا کنیم؟
یا اصلا این تابعی که من پیدا کردم با تابعی که منظور شما بود تفاوت داره؟
برداشتی که این حقیر دارم اینه که این تابع هم کماکان مشکل سربار رو داره با این تفاوت که به خاطر اجرای یک تابع مقداری به این سربار اضافه میشه.
پیشاپیش از راهنمایی شما متشکرم.

reza_rad
چهارشنبه 28 آذر 1386, 13:14 عصر
سلام دوست عزیز
کاملا صحیحه

البته مسلما از این روش:

به نظر من اول n سطر اول رو بگیر
بعد ترتیب رو عوض کن ORDER BY و سطر اول رو بگیر
کندتر نخواهد بود. چون درهر دو ordering انجام میشه برای بار اول.
امادر این روش بار دوم از روی row_number سلکت زدن سریعتر هست تا یک ordering مجدد.

این مثال هم توی همین صفحه ای بود که لینک دادم:


USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;

اگه توجه کنید از CTE استفاده کرده وبا ترکیب CTE و row_number دقیقا همین کاری رو که شما می خواهید انجام میده.
توجه داشته باشید که sql server باید با یک ordering خاصی به سطرهای جدول row_number بده پس حتما باید یکبار این ordering اعمال بشه.
البته اگه از اول یک شماره unique به سطرها داده بشه و الان بشه بر اساس اون select زد خیلی بهتر هست اما وقتی این راه ممکن نباشه row_number می تونه پیشنهاد خوبی باشه.

موفق باشید.