4 개의 임의의 숫자 (1 ~ 4)를 얻은 다음 일치하는 database_id 번호를 얻기 위해 다시 결합하는 간단한 스크립트가 있습니다. LEFT JOIN으로 스크립트를 실행하면 매번 4 개의 행이 반환됩니다 (예상 결과). 그러나 INNER JOIN으로 실행하면 다양한 수의 행 (때로는 2, 때로는 8)이 나타납니다.
논리적으로, database_ids 1-4의 행이 sys.databases에 있다는 것을 알고 있기 때문에 아무런 차이가 없어야합니다. 그리고 조인이 아닌 4 개의 행이있는 난수 테이블에서 선택하므로 4 개를 초과하는 행이 반환되지 않아야합니다.
이것은 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;
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()) ;
비 결정적 함수의 값에 조인이 없으므로 제대로 작동하는 것 같습니다.