PDA

View Full Version : انتخاب n رکورد به صورت Random :)



faramarz_s
سه شنبه 04 فروردین 1383, 22:28 عصر
برای Select د رکورد دلخواه (بر فرض 10 تا) بطور کاملا Random از جدول دیتابیس چه تغییراتی باید در فرمان Select اعمال نمود.
:roll:
Random:به این معناکه اگر 100 رکورد از 1 تا 100 داشته باشیم:
رکورد های 3و 4و 67و 89و ... (20 تا) و 100 Select شوند.

فرض بر اینست که جدول ما رکودی بنام Id دارد. :!:

Farhad.B.S
چهارشنبه 05 فروردین 1383, 01:18 صبح
میتونید فیلد آی دی رو طوری بسازید که به صورت ترتیبی بالا نره (مثلا از نوع GUID) ، و بعد از این دستور برای انتخاب رکورد های تصادفی استفاده کنید :


SELECT TOP 10 * FROM(SELECT * FROM MyTable ORDER BY Id)

روش بالا یکی از ساده ترین هاست ، روش های دیگه با پرداخت هزینه های دیگه (کم شدن سرعت و ...) هم وجود داره !

faramarz_s
چهارشنبه 05 فروردین 1383, 08:35 صبح
متاسفانه در جدول فوق فیلد ID الزاما Identity هست!

روش های دیگه با پرداخت هزینه های دیگه (کم شدن سرعت و ...) هم وجود داره !
مهم نیست بفرمایید. :oops:

فیلد آی دی رو طوری بسازید که به صورت ترتیبی بالا نره (مثلا از نوع GUID)
منظور شما انتخاب نوع GUID در محیط انترپرایز است یا با ربنامه نویسی؟

Farhad.B.S
چهارشنبه 05 فروردین 1383, 16:38 عصر
من هم نگفتم Identity نباشه . شما میتونید در هنگام طراحی فیلد ها نوع فیلد Id رو از نوع uniqueidentifier انتخاب کنید و بعد برای اینزرت مقادیر جدید داخل این فیلد از دستور NEWID استفاده کنید (این دستور یه GUID جدید برمیگردونه ) .
حتی اگه این اعداد ، مثلا به خاطر طولانی بودنشان یا ترتیبی نبودنشان مشکل زا هستند ، میتونید یه فیلد دیگه در کنار فیلد آی دی و از نوع uniqueidentifier داشته باشید.

چهارشنبه 05 فروردین 1383, 17:41 عصر
سلام


شما میتونید در هنگام طراحی فیلد ها نوع فیلد Id رو از نوع uniqueidentifier انتخاب کنید و بعد برای اینزرت مقادیر جدید داخل این فیلد از دستور NEWID استفاده کنید
خب با این روش فقط در اولین Select جواب میدهد. مثلا شما فرض کنید برای اولین بار دستور زیر را اجرا کنند:


SELECT TOP 10 * FROM(SELECT * FROM MyTable ORDER BY Id)

که جواب حداکثر 10 تا رکورد است. حال اگر دوباره دستور فوق را اجرا کنند باز همین 10 رکورد بازگردانده میشوند. خب اینکه نشد تصادفی!

faramarz_s
چهارشنبه 05 فروردین 1383, 18:01 عصر
خب اینکه نشد تصادفی!
I think so! :wink:

Farhad.B.S
چهارشنبه 05 فروردین 1383, 18:16 عصر
حق با شماست .
برای صحیح کار کردن این روش قبل از دستور سلکت میتونید از این استفاده کنید :


UPDATE MyTable SET Id=NEWID()


راه های دیگه هم وجود داره ، شاید اصلا خود SQL هم روشی برای این کار داشته باشه . به هر حال نتیجه تحقیقات رو اینجا مینویسم . :skull:

faramarz_s
چهارشنبه 05 فروردین 1383, 18:19 عصر
شاید اصلا خود SQL هم روشی برای این کار داشته باشه
That is what i am looking for
تشکر فرهاد خان

Farhad.B.S
چهارشنبه 05 فروردین 1383, 18:29 عصر
نتیجه تحقیحات :


SELECT TOP 10 * FROM MyTable ORDER BY NEWID()

faramarz_s
چهارشنبه 05 فروردین 1383, 18:33 عصر
برای اینزرت مقادیر جدید داخل این فیلد از دستور NEWID استفاده کنید (این دستور یه GUID جدید برمیگردونه ) .
این مطلب الان هم معتبره؟
ببینید جدول من اینه:

[QID] [int] IDENTITY (1, 1) NOT NULL ,
[CatId] [int] NOT NULL ,
[QLevel] [tinyint] NOT NULL ,
[Question] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[DescAnswer] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Answer] [tinyint] NULL

این تابع را چگونه باید بکارببرم؟تنها در Select?

چهارشنبه 05 فروردین 1383, 18:54 عصر
نتیجه تحقیحات :


SELECT TOP 10 * FROM MyTable ORDER BY NEWID()

:) :) :تشویق:

Farhad.B.S
چهارشنبه 05 فروردین 1383, 20:32 عصر
دستوری که در بالا نوشتم روی هر جدول با هر نوع فیلد کار میکنه (حتی نیازی به وجود یک فیلد uniqueidentifier هم نیست) .

faramarz_s
دوشنبه 17 فروردین 1383, 20:15 عصر
حتی نیازی به وجود یک فیلد uniqueidentifier هم نیست
در BooksOnline این نیاز هست چطور این درست کار می کنه(امتحان شد و درست بود:))
در ضمن یک نکته مهم :
من چند شرط هم در کوئری باید داشته باشم.نظیر:

SELECT TOP 10 * FROM tblQBank ORDER BY NEWID()
where field_name <> 0

پیغام خطا:


Server: Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'where'.

؟؟

دوشنبه 17 فروردین 1383, 20:47 عصر
سلام



SELECT TOP 10 * FROM tblQBank
where field_name <> 0
ORDER BY NEWID()

:)

faramarz_s
چهارشنبه 19 فروردین 1383, 12:02 عصر
:متفکر: :flower:

hamedgh
یک شنبه 11 آذر 1386, 08:51 صبح
شرمنده که این پست قدیمی را فعال می کنم
من این کد را در پراسیجر نوشتم و می خواستم مقدار ان را از یک فیلد تعریف شده بخواند خطا میدهد


SELECT TOP @L1 idq FROM soal
where idteacher = @idteacher and iddars = @idD and [level] = '1'
ORDER BY NEWID()


Server: Msg 170, Level 15, State 1, Procedure Ins_SelectQ, Line 13
Line 13: Incorrect syntax near '@L1'.