मेरे पास एक सरल स्क्रिप्ट है जिसमें चार यादृच्छिक संख्याएं (1 से 4 तक) मिलती हैं और फिर मिलान करने वाले डेटाबेस_आईडी नंबर प्राप्त करने के लिए वापस मिलती है। जब मैं एक स्क्रिप्ट को LEFT JOIN से चलाता हूं, तो मुझे हर बार (अपेक्षित परिणाम) चार पंक्तियाँ मिलती हैं। हालाँकि, जब मैं इसे INNER JOIN के साथ चलाता हूं, तो मुझे अलग-अलग पंक्तियों की संख्या मिलती है - कभी दो, कभी आठ।
तार्किक रूप से, इसमें कोई अंतर नहीं होना चाहिए क्योंकि मुझे पता है कि डेटाबेस डेटाबेस के साथ पंक्तियाँ 1-4 sys.dat डेटाबेस में मौजूद हैं। और क्योंकि हम चार पंक्तियों के साथ यादृच्छिक संख्या तालिका से चयन कर रहे हैं (जैसा कि इसमें शामिल होने का विरोध किया गया है), वहाँ कभी भी चार पंक्तियों से अधिक नहीं होना चाहिए।
यह SQL Server 2012 और 2014 दोनों में होता है। INNER JOIN में अलग-अलग संख्या में पंक्तियों को वापस लाने के कारण क्या होता है?
/* Works as expected -- always four rows */
SELECT rando.RandomNumber, d.database_id
FROM
(SELECT 1 + ABS(CHECKSUM(NEWID())) % (4) AS RandomNumber
FROM sys.databases WHERE database_id <= 4) AS rando
LEFT JOIN sys.databases d ON rando.RandomNumber = d.database_id;
/* Returns a varying number of rows */
SELECT rando.RandomNumber, d.database_id
FROM
(SELECT 1 + ABS(CHECKSUM(NEWID())) % (4) AS RandomNumber
FROM sys.databases WHERE database_id <= 4) AS rando
INNER JOIN sys.databases d ON rando.RandomNumber = d.database_id;
/* Also returns a varying number of rows */
WITH rando AS (
SELECT 1 + ABS(CHECKSUM(NEWID())) % (4) AS RandomNumber
FROM sys.databases WHERE database_id <= 4
)
SELECT r.RandomNumber, d.database_id
FROM rando AS r
INNER JOIN sys.databases d ON r.RandomNumber = d.database_id;
SELECT TOP (4) d.database_id FROM sys.databases AS d CROSS JOIN (VALUES (1),(2),(3),(4)) AS multi (i) WHERE d.database_id <= 4 ORDER BY CHECKSUM(NEWID()) ;
मुझे लगता है कि यह ठीक काम करता है क्योंकि गैर-नियतात्मक फ़ंक्शन के मूल्य में कोई शामिल नहीं है।