sql - Random select is not always returning a single row -


निम्नलिखित (सरलीकृत) कोड टुकड़ा का इरादा एक यादृच्छिक पंक्ति वापस करना है दुर्भाग्य से, जब हम क्वेरी विश्लेषक में इस खंड को चलाते हैं, तो यह शून्य और तीन परिणामों के बीच देता है

जैसा कि हमारे इनपुट तालिका में अद्वितीय आईडी के साथ बिल्कुल 5 पंक्तियाँ हैं और जैसा कि हम इस तालिका पर एक चयन करते हैं, जहां आईडी बराबर होती है एक यादृच्छिक संख्या होती है, हम स्टम्प्ड होते हैं कि ऐसा कभी नहीं होगा एक से अधिक पंक्ति वापस लौटे

नोट: अन्य चीजों के बीच, हमने पहले से ही चेकसम परिणाम को बिना किसी लाभ के पूर्णांक में ढंकने का प्रयास किया है।

  DECLARE @Table TABLE INTEGER की पहचान (1, 1), एफके 1 इंटेगियर) चुनें # चुनें 1 यूनिसेज का चयन करें 2 यूनियन सभी का चयन 3 यूनियन सभी का चयन 4 यूनियन सभी का चयन करें 5 चुनें * से @ सक्षम जहां आईडी = एबीएस (चेकस (न्यूड ())) % 5 + 1  

संपादित करें

हमारा उपयोग परिदृश्य इस प्रकार है (कृपया मौसम पर टिप्पणी न करें, यह सही काम करना है या नहीं। यह शक्तियां हैं

अंततः, हमें यथार्थवादी मूल्यों के साथ परिणाम बनाना चाहिए जहां निर्माता और वजन का संयोजन यादृच्छिक पर चयन करके अस्पष्ट है तालिका से मौजूदा भार स्वयं।
क्वेरी तब ऐसा कुछ हो जाएगी (यह भी एक कारण है कि RAND उपयोग नहीं किया जा सकता है)

  SELECT t.ID , FK1 = (SELECT FK1 से @Table WHERE आईडी = एबीएस (चेकस (न्यूड ()))% 5 + 1) से @ सक्षम करने के लिए  

क्योंकि आंतरिक चयन शून्य परिणाम लौटा सकता है, यह एक शून्य मान वापस करेगा जो फिर स्वीकार्य नहीं है यह जांच क्यों है कि शून्य और एक्स के परिणाम के भीतर आंतरिक चयन रिटर्न, यह सवाल उबरा (यह भी अंग्रेजी है?)।

उत्तर

क्या मेरे लिए प्रकाश चालू यह सरल अवलोकन था कि ABS (CHECKSUM (NEWID ()))% 5 + 1) को प्रत्येक पंक्ति के लिए पुनः मूल्यांकन किया गया था मैं इस धारणा के तहत था कि ABS (CHECKSUM (NEWID ()))% 5 + 1) का मूल्यांकन एक बार हो जाएगा, फिर मिलान होगा।

जवाब देने और धीरे धीरे लेकिन निश्चित रूप से बेहतर समझने के लिए मुझे सब कुछ करने के लिए धन्यवाद।

P> ऐसा क्यों होता है क्योंकि न्यूविड () तालिका में प्रत्येक पंक्ति के लिए एक अलग मान देता है प्रत्येक पंक्ति के लिए, स्वतंत्र रूप से दूसरों , इसे वापस लौटाते हुए पांच मौकों में से एक है नतीजतन, जैसा कि यह खड़ा है, आपके पास वास्तव में सभी 5 पंक्तियों के वापस आने के 3125 मौके हैं!

इसे देखने के लिए, निम्नलिखित क्वेरी चलाएं। आप देखेंगे कि प्रत्येक पंक्ति एक अलग आईडी हो जाती है।

  SELECT *, NEWID () से @ सक्षम  

यह आपके कोड को ठीक करेगा:

  DECLARE @Id SET @Id = ABS (CHECKSUM (NEWID ()))% 5 + 1 SELECT * FROM @Table WHERE आईडी = @ आईडी  

हालांकि, मुझे यकीन नहीं है कि यह तालिका से एक यादृच्छिक पंक्ति को चुनने का सबसे कारगर तरीका है।

आपको यह MSDN आलेख उपयोगी पा सकते हैं: (टी-एसक्यूएल में यादृच्छिक नमूनाकरण)

1 संपादित करें : अब मैं इसके बारे में सोचता हूं, यह संभवतः यह करने का सबसे कारगर तरीका है, पंक्तियों की संख्या को तय किया गया है और आईडी आईडी के निकटतम होने की गारंटी है

2 संपादित करें : उप-क्वेरी के रूप में उपयोग किए जाने वाले वांछित परिणाम प्राप्त करने के लिए, इस तरह शीर्ष 1 का उपयोग करें:

  SELECT टीएआईडी, एफके 1 = (टॉप टॉप 1 एफके 1 से @ न्यूज द्वारा टॉबल ऑर्डर) ()) @ टेबल टी से  

Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -