Eu tenho um script simples que obtém quatro números aleatórios (1 a 4) e, em seguida, junta-se novamente para obter o número de database_id correspondente. Quando executo o script com LEFT JOIN, recebo quatro linhas de volta todas as vezes (o resultado esperado). No entanto, quando executo com um INNER JOIN, obtenho um número variável de linhas - às vezes duas, às vezes oito.
Logicamente, não deve haver nenhuma diferença porque sei que existem linhas com database_ids 1-4 em sys.databases. E como estamos selecionando na tabela de números aleatórios com quatro linhas (em vez de unir a ela), nunca deve haver mais de quatro linhas retornadas.
Isso acontece tanto no SQL Server 2012 quanto no 2014. O que está fazendo com que o INNER JOIN retorne números variados de linhas?
/* 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;