RAND()
. के कारण आपकी सबक्वायरी नियतात्मक नहीं है और इस प्रकार Sponsor
. में प्रत्येक पंक्ति के लिए निष्पादित की जाती है तालिका और हर बार एक यादृच्छिक आईडी लौटाता है जो वर्तमान पंक्ति की आईडी से मेल खा सकता है या नहीं। तो यह केवल संभव नहीं है, कि कोई भी पंक्ति यादृच्छिक आईडी से मेल नहीं खाएगी। यह भी संभव है कि कई पंक्तियाँ होंगी।
दो प्रायोजकों के साथ नमूना डेटा के लिए सबक्वेरी निम्नलिखित मान लौटा सकती है:
- (1, 1) पहली पंक्ति से मेल खाएगा (1=1, 2=1)
- (1, 2) दोनों पंक्तियों से मेल खाएगा (1=1, 2=2)
- (2, 1) किसी भी पंक्ति से मेल नहीं खाएगा (1=2, 2=1)
- (2, 2) दूसरी पंक्ति से मेल खाएगा (1=2, 2=2)
यह सुनिश्चित करने के लिए कि सबक्वेरी केवल एक बार निष्पादित की जाती है, आप इसे SELECT क्लॉज का उपयोग कर सकते हैं। फिर परिणाम को Sponsor
. के साथ व्युत्पन्न तालिका के रूप में शामिल करें टेबल:
SELECT C.*, S.Name AS SponName
FROM (
SELECT C.ID AS CompID, C.Name AS CompName, (
SELECT ID FROM Sponsor WHERE Company = C.ID ORDER BY RAND() LIMIT 1
) as SponID
FROM Company C
) C
LEFT JOIN Sponsor S ON S.ID = C.SponID
डेमो:http://rextester.com/LSSJT25902