30 de jun. de 2009

Select do Select do Select

Você sabia que pode fazer um select em um resultado de outro select dentro do mesmo SQL? Provavelmente muita gente não conhece esse recurso. Até a um bom tempo atrás eu também não conhecia.

Esse recurso permite fazer coisas interessantes sobre result sets de SQLs complexos. Você pode, por exemplo, agrupar dados, fazer joins com outras tabelas, usar funções aggregates, dentre outras coisas.

Tomemos como exemplo o sequinte SQL hipotético:
select id_cliente, nome,
  case
    when situacao = 'I' then 1
    when situacao = 'X' then 2
    when situacao = 'A' then 3
  end id_situacao
from cliente
Digamos que você queira contar quantos clientes existem para cada nova situação. Fazer isso no SQL acima o tornaria um pouco mais complexo. Usando o recurso do select sobre um result set, torna a tarefa bem mais fácil:
select count(t1.id_situacao), s.ds_situacao from
(
select id_cliente, nome,
  case
    when situacao = 'I' then 1
    when situacao = 'X' then 2
    when situacao = 'A' then 3
  end id_situacao
from cliente
) t1
inner join situacao s on s.id_situacao = t1.id_situacao
Essa sintaxe acima funciona tanto no MS-SQL Server quanto no Oracle e acredito que também funcione no Firebird.

Bom proveito...