Olá Patrícia,
Bem vinda à Comunidade Microsoft Q&A
O problema principal da sua consulta é a falta de parênteses adequados na cláusula WHERE
, o que causa combinações cartesianas desnecessárias e possivelmente está levando à execução demorada. Além disso, a consulta pode ser otimizada utilizando JOIN
com LEFT JOIN
e uma lógica mais eficiente para considerar a rota direta e invertida.
Segue abaixo uma versão otimizada, técnica e didática da sua consulta:
SELECT DISTINCT
B.ano,
B.mes,
B.municipio_origem,
B.uf_origem,
B.municipio_destino,
B.uf_destino,
B.tipo_servico,
B.tipo_gratuidade,
B.tarifa,
B.bilhete,
COALESCE(KM1.extensao, KM2.extensao) AS extensao
INTO NOVO_BILHETE
FROM dbo.BILHETE B
LEFT JOIN dbo.KM_BRASIL KM1
ON B.municipio_origem = KM1.municipio_origem
AND B.uf_origem = KM1.uf_origem
AND B.municipio_destino= KM1.municipio_destino
AND B.uf_destino = KM1.uf_destino
LEFT JOIN dbo.KM_BRASIL KM2
ON B.municipio_origem = KM2.municipio_destino
AND B.uf_origem = KM2.uf_destino
AND B.municipio_destino= KM2.municipio_origem
AND B.uf_destino = KM2.uf_origem
=============================================================
Dicas Adicionais
- Crie índices nas colunas usadas nas junções (
municipio_origem
,uf_origem
,municipio_destino
,uf_destino
) para acelerar a execução.
Certifique-se de que os campos de texto tenham o mesmo formato e capitalização.