ورود

View Full Version : نمایش رکورد x به بعد



komeil64
شنبه 11 تیر 1390, 11:56 صبح
چطور سلکتی بنویسم که مثلا از رکورد 5 به بعد رو بهم نشون بده؟
ممنون میشم راهنمایی کنین

Galawij
شنبه 11 تیر 1390, 12:16 عصر
سلام دوست من
قبلا در مورد سوال شما بحث شده در این تاپیک (http://barnamenevis.org/showthread.php?288288-انتخاب-رکورد-دهم-تا-بیستم-از-یک-جدول&p=1268639&highlight=#post1268639) با یک تغییر کوچک به نتیجه می رسید.

mrshcom
پنج شنبه 16 تیر 1390, 00:30 صبح
select * from tbl.name
except
selecttop x * from tbl.name

که x شماره رکورد است.

komeil64
جمعه 21 بهمن 1390, 21:38 عصر
سلام
راستش نشد
من دستور زیر رو نوشتم
select top(2) from tbl_news except select top(20) from tbl_news order by ID DESC
در اصل من می خوام دو تا رکورد از رکورد بیست به بعد نشون بده یعنی رکورد 21 و 22
ممنون میشم راهنمایی کنید

بهزادصادقی
جمعه 21 بهمن 1390, 21:55 عصر
این جواب میده؟

select
a.*
from
(
select
row_number() over( order by t.ID desc ) rn,
t.*
from
tbl_news t
) a
where
rn between 21 and 22

in_chand_nafar
جمعه 21 بهمن 1390, 22:17 عصر
به اين كوئري توجه كن
از لحاظ Performance‌روش حساب باز نكن راه هاي خوبي براي بهينه كردنش وجود داره فعلا كارت رو راه مياندازه

USE Northwind
GO
SELECT TOP(2) * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY CustomerID) AS RowNo
,CustomerID,CompanyName, Country
FROM Customers
) X WHERE X.RowNo>20
GO
-------------------------------------
--روش دوم
WITH X
AS
(
SELECT ROW_NUMBER() OVER(ORDER BY CustomerID) AS RowNo
,CustomerID,CompanyName, Country
FROM Customers
)
SELECT TOP(2) * FROM X WHERE X.RowNo>20

بهزادصادقی
شنبه 22 بهمن 1390, 00:42 صبح
دوست عزیز، in_chand_nafar:

در هر دو نسخه کوئری شما، اگر شما جمله order by X.RowNo را به select خود از جدول مجازی X اضافه ننمایید، SQL Server گارانتی نخواهد کرد که دو سطری که جمله (TOP (2 بر می‌گرداند، سطرهایی باشد که مقدار RowNo آنها برابر است با 21 و 22. استفاده از گزینه TOP بدون گزینه ORDER BY، هیچ ترتیب خاصی را بر مجموعه نتیجه‌ای که کوئری ما برمی‌گرداند حاکم نمی نماید. هر وقت ما از گزینه TOP بدون ذکر گزینه ORDER BY استفاده می‌کنیم، ترتیب سطرهای نتیجه می‌تواند کاملا راندوم باشد. برای اینکه ترتیب همان باشد که در ذهن داریم، حتما باید از گزینه ORDER BY استفاده نماییم.

مرجع: مستند فنی مایکروسافت در مورد TOP (http://technet.microsoft.com/en-us/library/ms189463.aspx)

بالاخص، جمله زیر در صفحه بالا:


If the query includes an ORDER BY clause, the first expression rows, or expression percent of rows, ordered by the ORDER BY clause are returned. If the query has no ORDER BY clause, the order of the rows is arbitrary

in_chand_nafar
شنبه 22 بهمن 1390, 11:01 صبح
دوست عزيز در واقع در كليه كوئري هايي از
ROW_NUMBER()استفاده مي كنند مرتب سازي بر اساس فيلدي يا فيلدهايي است كه بدان اشاره شده است انجام مي دهند بنابراين كافي است كه يك ركورد در جدول درج شود كه مرتب سازي شما را پس و پيش كند يعني با درج يك ركورد نتيجه مقدار موجوددر Row Number فرق كند در اين صورت چه با TOP نتيجه را بدست آورده و چه با rn between 21 and 22 نتيجه را بدست آوريم هيچ گارانتي براي يكسان بودن وجود نخواهد داشت
و يا اگر ركوردي هم از جدول حذف شود كه ديگر هيچ گارانتي نخواهد بود

یوسف زالی
شنبه 22 بهمن 1390, 11:11 صبح
سلام.
جناب in_chand_nafar آقای صادقی درست می فرمایند.
فرض کنید که مرتب سازی نهایی بر اساس RN اتفاق نیفته، کد Top حتما با شکست روبرو می شه اما Between فیلترینگ می کنه و سطرهایی رو با RN های مورد نیاز تحویل می ده.
Row_Number درون خودش یک Order داره که بر اساس اون نتیجه دارای فیلدی اضافی RN و سورت Order خواهد بود، اما هیچ تضمینی برای مرتب بودن خود خروجی بر اساس خود RN وجود نداره.

in_chand_nafar
شنبه 22 بهمن 1390, 11:31 صبح
دوستان پس از مطالعه قانع شدم ممنون كه به نكات مهمي اشاره كرديد