আমার কাছে একটি সাধারণ স্ক্রিপ্ট রয়েছে যা চারটি এলোমেলো সংখ্যা পেয়ে থাকে (1 থেকে 4 এর মধ্যে) এবং তারপরে ম্যাচিং ডাটাবেস_আইডি নম্বর পেতে ফিরে যোগ দেয়। যখন আমি স্ক্রিপ্টটি একটি বাম যোগদানের সাথে চালাই, আমি প্রতিবার চারটি সারি ফিরে পাই (প্রত্যাশিত ফলাফল)। যাইহোক, আমি যখন এটি একটি অন্তর্ভুক্ত যোগদান দিয়ে চালিত করি, তখন আমি বিভিন্ন ধরণের সারি পাই - কখনও কখনও দুটি, কখনও কখনও আট eight
যৌক্তিকভাবে, কোনও পার্থক্য হওয়া উচিত না কারণ আমি জানি যে ডাটাবেস_আইডস 1-4 সহ সারিগুলি সিস.ড্যাটাবেসগুলিতে বিদ্যমান। এবং যেহেতু আমরা চারটি সারি (এটিতে যোগদানের বিপরীতে) দিয়ে এলোমেলো নম্বর টেবিলটি থেকে নির্বাচন করছি, সেখানে আর কখনও কখনও চারটি সারি আর ফিরে আসবে না।
এটি এসকিউএল সার্ভার ২০১২ এবং 2014 উভয় ক্ষেত্রেই ঘটে happens অভ্যন্তরীণ যোগদানের ফলে কীভাবে বিভিন্ন সংখ্যক সারি ফিরে আসে?
/* 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()) ;
আমি অনুমান করি যে এটি ঠিকঠাক কাজ করে কারণ অ-নিরোধক ক্রিয়াকলাপের মানটিতে কোনও যোগসূত্র নেই।