我有一个简单的脚本,它获取四个随机数(1 到 4),然后返回以获取匹配的 database_id 号。当我使用 LEFT JOIN 运行脚本时,我每次都会返回四行(预期结果)。但是,当我使用 INNER JOIN 运行它时,我得到了不同数量的行——有时是两行,有时是八行。
从逻辑上讲,应该没有任何区别,因为我知道 database_ids 1-4 的行存在于 sys.databases 中。并且因为我们从具有四行的随机数字表中进行选择(而不是加入它),所以返回的行永远不会超过四行。
这在 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;