Na preparação da minha pergunta anterior do Constant Scan, eu estava experimentando VALUES
de várias maneiras e me deparei com a coisa sobre a junção VALUES
que parece estranha para mim.
A configuração é simples
CREATE TABLE #data ([Id] int);
INSERT INTO #data VALUES (101), (103);
Então há uma consulta
DECLARE @id1 int = 101, @id2 int = 102;
SELECT *
FROM (VALUES (@id1), (@id2)) p([Id])
FULL HASH JOIN #data d ON d.[Id] = p.[Id];
Não há nada de especial nisso. Ele funciona e produz seu resultado, se você executá-lo. Aqui está o seu plano de execução
Removendo uma linha de VALUES
no entanto
SELECT *
FROM (VALUES (@id1)) p([Id])
FULL HASH JOIN #data d ON d.[Id] = p.[Id];
faz com que o otimizador falhe
Msg 8622, Level 16, State 1, Line 1
Processador de consultas não pôde produzir um plano de consulta...
Por quê? Existe uma maneira (além de colocar o parâmetro na tabela temporária) para fazê-lo funcionar usando o algoritmo de hash?
Observação: isso não é um dispositivo real e serve para estudar o comportamento e os recursos do otimizador.
O exemplo acima foi testado em
Microsoft SQL Server 2017 (RTM-CU15-GDR) (KB4505225) - 14.0.3192.2 (X64)