comando with

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
mello
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Seg, 06 Mar 2006 5:26 pm
Localização: sp

alguém conhece o comando with?

ele funciona como um cursor na select?

percebi que você deve usar todas as tabelas virtuais declaradas.

Selecionar tudo

with
cursor1 as (select campo from tabela1),
cursor2 as (select campo from tabela2)

select cursor.*,
         cursor2.*
  from cursor1,
          cursor2
where cursor1.campo = cursor2.campo;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bom, na minha opinião o WITH serve mais pra você poder "montar" uma query e dar um nome a ela.
Desta forma, você pode criar uma query abaixo utilizando esse nome, como se fosse uma tabela.

Fica melhor visivel do que encher a query de SUB_QUERIES.

Mas pode ser tudo feito por sub-selects que dá na mesma
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Além disso, o uso de WITH serve também para otimização de certas consultas/estruturas.
Dependendo do uso da cláusula utilizada no WITH ele já armazena o resultado antes e pode ser reutilizado melhor posteriormente. Como substituir um subselect que é utilizado varias vezes como tabela, em usos com o UNION e etc...
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Boa tarde, Pessoal...

Aqui na empresa tive uma melhora de performance conforme o Noctifero citou.
Exemplificando como melhoramos, o cenário foi mais ou menos este (tabelas e associações fictícias, apenas para ilustração):

Selecionar tudo

select nf.colunaA
     , nf.colunaB
     , nfe.colunaA
  from tb_nota_fiscal nf
     , tb_nfe nfe
 where nf.num = nfe.num
   and nf.dt between x and y     

union 

select nf.colunaA
     , nf.colunaB
     , nfi.colunaA
  from tb_nota_fiscal nf
     , tb_nfit_tributos nfi
 where nf.num = nfi.num
   and nf.dt between x and y  
   

union 
      

select nf.colunaA
     , nf.colunaB
     , nfc.colunaA
  from tb_nota_fiscal nf
     , tb_nfit_contabil nfc
 where nf.num = nfc.num
   and nf.dt between x and y  


Notem que a tabela de Notas Fiscais foi replicada, com o mesmo range de busca (Where de data),
para os 3 unions.
Isso tornava o nosso processo lento, moroso.

Qual foi a solução adotada no caso?

Selecionar tudo

with nfiscais as (select nf.colunaA
                       , nf.colunaB
                    from tb_nota_fiscal nf
                   where nf.dt between x and y)
select nf.colunaA
     , nf.colunaB
     , nfe.colunaA
  from nfiscais nf
     , tb_nfe nfe 
 where nf.num = nfe.num

union 

select nf.colunaA
     , nf.colunaB
     , nfi.colunaA
  from nfiscais nf
     , tb_nfit_tributos nfi
 where nf.num = nfi.num

union 

select nf.colunaA
     , nf.colunaB
     , nfc.colunaA
  from nfiscais nf
     , tb_nfit_contabil nfc
 where nf.num = nfc.num
                   

Ou seja, apenas uma busca nas Notas Fiscais por range e, nos unions apenas utilização da tabela do With.
Lembro-me que na época o ganho foi imenso (neste caso).

Abraço,

Trevisolli
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Muito bom!
No caso de UNION realmente é uma ótima alternativa.
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

A cláusula WITH é muito boa p/ otimizar instruções SQL onde você referencia a mesma tabela N vezes. Já vi muitos SQLs de relatórios em que o desenvolvedor escreve várias subqueries referenciando a mesma tabela. Ao invés de referenciar a tabela, referencie a tabela temporária criado pela cláusula WITH.

Mais informações: http://www.fabioprado.net/2010/10/claus ... eries.html

[]s
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes