प्रदीप अडिगा का पहला सुझाव, ORDER BY NEWID()
ठीक है और कुछ इस कारण से मैंने अतीत में उपयोग किया है।
उपयोग करने में सावधानी बरतें RAND()
- कई संदर्भों में यह केवल एक बार कथन के अनुसार निष्पादित किया जाता है, इसलिए ORDER BY RAND()
इसका कोई प्रभाव नहीं होगा (जैसा कि आप प्रत्येक पंक्ति के लिए RAND () से एक ही परिणाम प्राप्त कर रहे हैं)।
उदाहरण के लिए:
SELECT display_name, RAND() FROM tr_person
हमारी व्यक्ति तालिका से एक नाम और एक "यादृच्छिक" संख्या देता है, जो प्रत्येक पंक्ति के लिए समान है। प्रत्येक बार जब आप क्वेरी चलाते हैं, तो संख्या भिन्न होती है, लेकिन हर बार प्रत्येक पंक्ति के लिए समान होती है।
यह दिखाने के लिए कि RAND()
एक ORDER BY
क्लॉज में इस्तेमाल किया गया मामला ऐसा ही है , मैं कोशिश करता हूं:
SELECT display_name FROM tr_person ORDER BY RAND(), display_name
परिणाम अभी भी नाम के आधार पर आदेश दिए गए हैं जो यह दर्शाता है कि पहले के सॉर्ट फ़ील्ड (यादृच्छिक होने की उम्मीद) का कोई प्रभाव नहीं है, इसलिए संभवतः हमेशा समान मूल्य होता है।
NEWID()
हालांकि काम करना आदेश है , क्योंकि यदि NEWID () को हमेशा यूयूआईडी के उद्देश्य को आश्वस्त नहीं किया जाता है, तो एक ही राज्य में कई नई पंक्तियों को अद्वितीय पहचानकर्ताओं के साथ सम्मिलित करते हुए तोड़ा जाएगा, क्योंकि वे कुंजी हैं:
SELECT display_name FROM tr_person ORDER BY NEWID()
है नाम "बेतरतीब ढंग से" आदेश।
अन्य DBMS
उपरोक्त MSSQL के लिए सही है (2005 और 2008 कम से कम, और अगर मुझे सही रूप में 2000 भी याद है)। एक नया UUID लौटाने वाले फ़ंक्शन का मूल्यांकन हर बार सभी DBMSs NEWID () MSSQL के अंतर्गत किया जाना चाहिए, लेकिन यह प्रलेखन और / या अपने स्वयं के परीक्षणों द्वारा इसे सत्यापित करने के लायक है। अन्य मनमाने परिणाम वाले कार्यों का व्यवहार, जैसे RAND (), DBMSs के बीच भिन्न होने की अधिक संभावना है, इसलिए फिर से दस्तावेज़ देखें।
साथ ही मैंने कुछ संदर्भों में यूयूआईडी मूल्यों को अनदेखा करते हुए देखा है क्योंकि डीबी मानता है कि इस प्रकार का कोई सार्थक आदेश नहीं है। यदि आपको ऐसा लगता है कि यह मामला स्पष्ट रूप से UUID को ऑर्डरिंग क्लॉज में एक स्ट्रिंग प्रकार के लिए कास्ट करता है, या इसके चारों ओर कुछ अन्य फ़ंक्शन को लपेटता है, जैसे CHECKSUM()
SQL सर्वर (इसमें से एक छोटा सा प्रदर्शन अंतर भी हो सकता है क्योंकि ऑर्डर करना होगा 32-बिट का मान 128-बिट वाला नहीं है, हालाँकि उस लाभ का CHECKSUM()
मूल्य प्रति मूल्य चलने की लागत पहले है कि मैं आपको परीक्षण करने के लिए छोड़ दूंगा)।
पक्षीय लेख
यदि आप मनमाने ढंग से लेकिन कुछ बार-बार दोहराने योग्य आदेश चाहते हैं, तो पंक्तियों में डेटा के कुछ अपेक्षाकृत अनियंत्रित सबसेट द्वारा आदेश दें। उदाहरण के लिए या तो इन नामों को एक मनमाना लेकिन दोहराए जाने वाले क्रम में लौटाया जाएगा:
SELECT display_name FROM tr_person ORDER BY CHECKSUM(display_name), display_name -- order by the checksum of some of the row's data
SELECT display_name FROM tr_person ORDER BY SUBSTRING(display_name, LEN(display_name)/2, 128) -- order by part of the name field, but not in any an obviously recognisable order)
महत्वाकांक्षी लेकिन दोहराए जाने वाले आदेश अक्सर अनुप्रयोगों में उपयोगी नहीं होते हैं, हालांकि परीक्षण में उपयोगी हो सकता है यदि आप विभिन्न आदेशों में परिणामों पर कुछ कोड का परीक्षण करना चाहते हैं, लेकिन हर बार एक ही तरीके से कई बार दोहराने में सक्षम होना चाहते हैं (औसत समय प्राप्त करने के लिए) कई रनों से अधिक परिणाम, या परीक्षण जो आपने कोड के लिए किए गए एक फ़िक्सेस को किसी विशेष इनपुट परिणाम द्वारा पहले उजागर की गई समस्या या अक्षमता को दूर करते हैं, या केवल यह परीक्षण करने के लिए कि आपका कोड "स्थिर" है, हर बार एक ही परिणाम देता है यदि दिए गए क्रम में एक ही डेटा भेजा जाता है)।
इस चाल का उपयोग फ़ंक्शंस से अधिक मनमानी परिणाम प्राप्त करने के लिए भी किया जा सकता है, जो आपके शरीर के भीतर न्यूआईडी () जैसे गैर-नियतात्मक कॉल की अनुमति नहीं देते हैं। फिर से, यह कुछ ऐसा नहीं है जो वास्तविक दुनिया में अक्सर उपयोगी होने की संभावना है, लेकिन काम में आ सकता है यदि आप कुछ यादृच्छिक और "यादृच्छिक-ईश" वापस करने के लिए एक फ़ंक्शन चाहते हैं, तो यह पर्याप्त है (लेकिन नियमों को याद रखने के लिए सावधान रहें जो निर्धारित करते हैं जब उपयोगकर्ता परिभाषित कार्यों का विकास होता है, यानी आमतौर पर केवल एक बार प्रति पंक्ति, या आपके परिणाम वह नहीं हो सकते हैं जो आप अपेक्षा / आवश्यकता के अनुसार करते हैं)।
प्रदर्शन
जैसा कि EBarr बताते हैं, उपरोक्त में से किसी के साथ प्रदर्शन समस्याएँ हो सकती हैं। कुछ पंक्तियों से अधिक के लिए आप सही क्रम में वापस पढ़ी जा रही पंक्तियों की अनुरोधित संख्या से पहले टेम्पर्ड करने के लिए आउटपुट को देखने के लिए लगभग तैयार हैं, जिसका अर्थ है कि भले ही आप शीर्ष 10 की तलाश कर रहे हों, आपको पूर्ण सूचकांक मिल सकता है स्कैन (या बदतर, टेबल स्कैन) लिखने की एक बड़ी ब्लॉक के साथ होता है। उत्पादन में इस का उपयोग करने से पहले यथार्थवादी आंकड़ों के साथ बेंचमार्क करने के लिए, अधिकांश चीजों के साथ, यह महत्वपूर्ण रूप से महत्वपूर्ण हो सकता है।