Há um código que estou tentando melhorar que se parece com isso (exemplo simples):
SELECT DISTINCT a.col_a
,COALESCE(b1.col_c, b2.col_c, b3.col_c)
FROM tab_a a
LEFT JOIN tab_b b1
ON a.col_a = b1.col_a
AND b1.col_b = 'blabla1'
LEFT JOIN tab_b b2
ON a.col_a = b2.col_a
AND b2.col_b = 'blabla2'
LEFT JOIN tab_b b3
ON a.col_a = b3.col_a
AND b3.col_b = 'blabla3';
Você pode usar o seguinte script para recriar essas tabelas
CREATE TABLE tab_a(col_a int)
CREATE TABLE tab_b(col_a INT, col_b VARCHAR(10), col_c INT)
INSERT INTO dbo.tab_a ( col_a ) VALUES ( 1 ), ( 2 ), ( 3 );
INSERT INTO dbo.tab_b ( col_a
,col_b
,col_c )
VALUES ( 1, 'blabla1', 1 )
,( 1, 'blabla2', 3 )
,( 1, 'blabla2', 5 )
,( 2, 'blabla2', NULL )
,( 2, 'blabla3', 5 );
Como posso alterá-lo para 1 join + talvez a função de janela e como reescrever a parte coalesce . Só para explicar, o plano atual mostra 3 varreduras tab_b, quero reduzi-lo para 1.
Esta solução tem 1 tab_b
scan
mas adicionasort
porque você quer escolherb.col_c
como no seuCOALESCE
. No exemplo acima issoorder
corresponde aoorder
dado por yourconstants
injoin condition
que corresponde aos valores dac
coluna. Caso o pedido seja diferente, a coisa será mais complicada, pois você deve escrever umaorder by
cláusula personalizada.Se você quiser ou tiver essas 3 descrições estáticas, você pode fazer o seguinte:
Insira os valores na tabela temporária ou variável, mas na forma de coluna https://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server
Escreva o script em sua resposta, mas exclua esses 3 LEFT JOIN e apenas faça um CROSS JOIN para a tabela temporária ou variável
Você também pode alterar seu modelo de banco de dados para satisfazer o que você mais precisa.
Para ajudar, compartilhe o modelo de banco de dados atual para que possamos ajudá-lo ainda mais. Você pode criá-lo com a seguinte opção:
1 join conforme solicitado ^^ editado para um estilo um pouco mais elegante usando IN ( .. )