PDA

View Full Version : دریافت رکورد سوم



alizanganeh
چهارشنبه 05 آذر 1393, 14:45 عصر
سلام
میخواستم بدونم با کوری SQL چطوری میشه با دستور SELECT مثلا رکورد سوم یا چهارم یا هر رکوردی که خواستیم رو بگیریم . میدونم که Top(3) 3 رکورد اول رو برمیگردونه ولی رکورد سوم رو نمیدونم . اگر میشه بگید و یک نمونه بهم بدید . ممنون از همه

حمیدرضاصادقیان
چهارشنبه 05 آذر 1393, 15:51 عصر
سلام.
در نسخه 2012 با استفاده از Offset Fetch این قابلیت هست
به طور مثال

SELECT * FROM dbo.table1
ORDER BY id
offset 3 ROWS FETCH NEXT 1 ROWS only

در این مثال براساس ID مرتب شده است و 3 رکورد اول رو چشم پوشی میکنه و نشون نمیده و فقط رکورد بعد از رکورد 3 رو که میشه مثلا سطر چهارم نشون میده.

Rejnev
چهارشنبه 05 آذر 1393, 17:14 عصر
من موندم بجای این دستور طولانی نمیشد sql دستور limit رو اضافه میکرد؟!

از طریق row_number هم میتونی به ج برسی:


WITH tempView AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY ID) as Row FROM MyTable
)
SELECT * FROM tempView WHERE Row=3

مرتضی تقدمی
چهارشنبه 05 آذر 1393, 19:18 عصر
سلام
از این روش هم میشه:

--drop table #a
select TOP 3 * into #a from tblLink

select TOP 1 * from #a
order by LinkId desc

حمیدرضاصادقیان
چهارشنبه 05 آذر 1393, 22:02 عصر
با Cursor هم میشه نوشت.!!!
صرف اینکه یک کار رو با چند دستور بشه نوشته که مشکل خاصی نیست.
باید مسائل Performance رو نیز لحاظ کرد.
مورد سوم که از جداول Temp استفاده شده کاملا از لحاظ کار غلطه و لقمه رو قشنگ دو دور عملا دور سرتون گردوندین.درمورد مورد دوم نیز باید اشاره کنم که به جای یک خط کد شما دوتا Select رو نوشتید و دوبار داره یک Select اجرا میشه و روی یک جدول ساده Performance اینکار 60 به 40 هست نسبت به کدی که من نوشتم.
لطفا اگر مطلبی رو مینویسید سعی کنید درست راهنمایی کنید.

alizanganeh
چهارشنبه 05 آذر 1393, 22:36 عصر
سلام.
در نسخه 2012 با استفاده از Offset Fetch این قابلیت هست
به طور مثال

SELECT * FROM dbo.table1
ORDER BY id
offset 3 ROWS FETCH NEXT 1 ROWS only

در این مثال براساس ID مرتب شده است و 3 رکورد اول رو چشم پوشی میکنه و نشون نمیده و فقط رکورد بعد از رکورد 3 رو که میشه مثلا سطر چهارم نشون میده.



ممنون عزیزم ولی وقتی میزنم این ارور رو میده :
Unable to parse query text

این کوری رو روی یک View دارم مینویسم و بر اساس تاریخ بصورت نذولی مرتب میکنم و وقتی کد شما رو میزنم بعد از این ارور مقداری بر نمیگردونه

حمیدرضاصادقیان
چهارشنبه 05 آذر 1393, 22:41 عصر
این کد مشکلی نداره. و عرض کردم حتما باید از SQL Server نسخه 2012 به بالا استفاده کنید تا قابل استفاده باشه.

alizanganeh
چهارشنبه 05 آذر 1393, 22:48 عصر
این کد مشکلی نداره. و عرض کردم حتما باید از SQL Server نسخه 2012 به بالا استفاده کنید تا قابل استفاده باشه.

آها من دارم از sql express ویژال استودیو 2012 استفاده میکنم . باشه ممنون . ولی کدی که با temp بود بی دردسر کار میکنه

مرتضی تقدمی
پنج شنبه 06 آذر 1393, 15:34 عصر
با Cursor هم میشه نوشت.!!!
صرف اینکه یک کار رو با چند دستور بشه نوشته که مشکل خاصی نیست.
باید مسائل Performance رو نیز لحاظ کرد.
مورد سوم که از جداول Temp استفاده شده کاملا از لحاظ کار غلطه و لقمه رو قشنگ دو دور عملا دور سرتون گردوندین.درمورد مورد دوم نیز باید اشاره کنم که به جای یک خط کد شما دوتا Select رو نوشتید و دوبار داره یک Select اجرا میشه و روی یک جدول ساده Performance اینکار 60 به 40 هست نسبت به کدی که من نوشتم.
لطفا اگر مطلبی رو مینویسید سعی کنید درست راهنمایی کنید.

چون شما گفتید کدتون فقط در 2012 کار میکنه من این کد رو نوشتم.

حمیدرضاصادقیان
پنج شنبه 06 آذر 1393, 18:11 عصر
خوب برای نسخه 2005 به بعد بازنیز میشه از کدی که در پست 3 نوشته شده استفاده کرد.
یکی از معضلات برنامه نویسی، استفاده بسیار زیادجداول Temp هست که متاسفانه اکثر برنامه نویسان به این نکات توجه ندارند بعد وقتی تعداد کاربران و تعداد درخواستها که زیاد میشه و سیستم دچار کندی میشه تازه درصدد رفع اون برمیان.

مرتضی تقدمی
پنج شنبه 06 آذر 1393, 20:27 عصر
خب بعد از استفاده با drop کردن جدول تمپ اوضاع کمی بهتر میشه.

حمیدرضاصادقیان
پنج شنبه 06 آذر 1393, 21:12 عصر
بحث حذف خود جدول موقت نیست.
بحث سر اینه که کلا روش غلطه. روش اشتباهه.
شما دو تا Select با یک درج دارید انجام میدین. فرض کنید رکورد 1001 رو بخواد برگردونه. اصلا صحبت من سر این نیست که جدول حذف بشه.
کل روش کار شما اشتباهه.
این طرز تفکر در حل مسائل باید اصلاح بشه.
این نوع فکر کردن ، طرز تفکر Set based نیست. من در سایت خودم که لینکش نیز در امضام هست دارم این مباحث رو آموزش میدم.تمایل داشتید مطالعه بفرمایید.

Rejnev
پنج شنبه 06 آذر 1393, 21:23 عصر
جناب صادقیان، مایکروسافت چرا limit رو در همون ابتدا توی sql server در نظر نگرفت؟ این دستور مشکلی داره؟

حمیدرضاصادقیان
پنج شنبه 06 آذر 1393, 22:36 عصر
به خاطر اینکه دستور Limit جز SQL Standard نیست و جز اضافات زبانهای Mysql,Postgresql,SQLLite هست به همین خاطر مایکروسافت نیز اونو اضافه نکرده و به جاش دستور fetch را که جز SQL Standard هست پیاده سازی کرده است.
زبان T-SQL از زبان ANSI SQL یا همان SQL Standard گرفته شده و معمولا اضافات اون ، به زبان T-SQL اضافه می شود به علاوه اینکه خودشان نیز بخواهند قابلیتی به این زبان اضافه کنند.

ASKaffash
شنبه 08 آذر 1393, 06:54 صبح
سلام
اینطوری هم میشود نوشت :
Select Top 1 * From
(
Select Top 3 *
From MyTable
Order By MyOrder
) T
Order By MyOrder Desc