O
WITH
cláusula é para fatoração de subconsulta, também conhecida como expressões de tabela comuns ou CTEs:
A cláusula WITH query_name permite atribuir um nome a um bloco de subconsulta. Você pode fazer referência ao bloco de subconsulta em vários lugares na consulta especificando query_name. O Oracle Database otimiza a consulta tratando o nome da consulta como uma exibição em linha ou como uma tabela temporária.
Em seu segundo exemplo, o que você chamou de
temp_table
é uma exibição em linha, não uma tabela temporária. Em muitos casos, a escolha de qual usar se resume ao seu estilo preferido, e os CTEs podem tornar o código mais legível, especialmente com vários níveis de subconsultas (as opiniões variam, é claro). Se você consultar a visualização CTE/inline apenas uma vez, provavelmente não verá nenhuma diferença no desempenho, e o otimizador pode acabar com o mesmo plano.
Eles são particularmente úteis quando você precisa usar a mesma subconsulta em mais de um local, como em uma união. Você pode extrair uma visualização em linha em um CTE para que o código não seja repetido e isso permite que o otimizador o materialize se achar que isso seria benéfico.
Por exemplo, este exemplo inventado:
select curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0
poderia ser refatorado para:
with temp_table as (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0
A subconsulta não precisa mais ser repetida. Quanto mais complicado for o código repetido, mais benéfico será, do ponto de vista da manutenção, usar um CTE. E quanto mais cara for a subconsulta, mais benefícios de desempenho você poderia ver usando um CTE, embora o otimizador geralmente seja muito bom em descobrir o que você está fazendo de qualquer maneira.