Tengo un script simple que obtiene cuatro números aleatorios (1 a 4) y luego se une para obtener el número correspondiente de database_id. Cuando ejecuto el script con un LEFT JOIN, obtengo cuatro filas cada vez (el resultado esperado). Sin embargo, cuando lo ejecuto con un INNER JOIN, obtengo un número variable de filas, a veces dos, a veces ocho.
Lógicamente, no debería haber ninguna diferencia porque sé que existen filas con database_ids 1-4 en sys.databases. Y debido a que estamos seleccionando de la tabla de números aleatorios con cuatro filas (en lugar de unirlas), nunca debería haber más de cuatro filas devueltas.
Esto sucede tanto en SQL Server 2012 como en 2014. ¿Qué está causando que INNER JOIN devuelva un número variable de filas?
/* 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()) ;
supongo que funciona bien porque no hay una unión en el valor de la función no determinista.