Tôi có một tập lệnh đơn giản nhận được bốn số ngẫu nhiên (1 đến 4) và sau đó tham gia lại để lấy số cơ sở dữ liệu phù hợp. Khi tôi chạy tập lệnh với THAM GIA TRÁI PHIẾU, tôi nhận được bốn hàng mỗi lần (kết quả mong đợi). Tuy nhiên, khi tôi chạy nó với INNER THAM GIA, tôi nhận được một số lượng hàng khác nhau - đôi khi là hai, đôi khi là tám.
Về mặt logic, không nên có bất kỳ sự khác biệt nào vì tôi biết các hàng có cơ sở dữ liệu 1-4 tồn tại trong sys.database. Và bởi vì chúng tôi đang chọn từ bảng số ngẫu nhiên có bốn hàng (trái ngược với việc tham gia vào bảng đó), không bao giờ có hơn bốn hàng được trả về.
Điều này xảy ra trong cả SQL Server 2012 và 2014. Điều gì khiến INNER THAM GIA trả về số lượng hàng khác nhau?
/* 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()) ;
Tôi đoán nó hoạt động tốt vì không có tham gia vào giá trị của hàm không xác định.