Procedure

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
leandrolinof
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 33
Registrado em: Qua, 17 Fev 2010 6:30 am
Localização: Americana

Bom dia pessoal!

Tenho o seguinte código PL:
select t.* from mgadm.est_itenslistamateriais t
inner join mgadm.est_produtos b

On (b.pro_tab_in_codigo = t.com_tab_in_codigo
and b.pro_pad_in_codigo = t.com_pad_in_codigo
and b.pro_in_codigo = t.com_in_codigo)

And t.lis_in_revisao = (Select Max(d.lis_in_revisao) From mgadm.est_revisaolistamateriais d
Where d.pro_tab_in_codigo = t.pro_tab_in_codigo
And d.pro_pad_in_codigo = t.pro_pad_in_codigo
And d.pro_in_codigo = t.pro_in_codigo )

where b.pro_st_alternativo = '0001184'

Union

select t.* from mgadm.est_itenslistamateriais t
inner join mgadm.est_produtos b

On (b.pro_tab_in_codigo = t.com_tab_in_codigo
and b.pro_pad_in_codigo = t.com_pad_in_codigo
and b.pro_in_codigo = t.com_in_codigo)

And t.lis_in_revisao = (Select Max(d.lis_in_revisao) From mgadm.est_revisaolistamateriais d
Where d.pro_tab_in_codigo = t.pro_tab_in_codigo
And d.pro_pad_in_codigo = t.pro_pad_in_codigo
And d.pro_in_codigo = t.pro_in_codigo )

where b.pro_st_alternativo = '0001016'

Quero criar uma Procedure no qual o campo pro_st_alternativo seja um parametro de pesquisa de relatório pro usuário no Crystal.
Só que meu problema é que irá ter uns 10 campos de parametros de pesquisa no relatório, terei que fazer 10 UNIONS diferente pra cada parametro.
Gostaria de saber como posso fazer isso com o UNION? Ou se tem um melhor jeito de programar isso?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Tenta usando IN e colocando os valores lá dentro.

Você só quer colunas da tabela T? Se for isso o melhor por conta de performance e plano de acesso às tabelas é fazer exists em vez de Inner Join. Testa o seguinte:

Selecionar tudo

SELECT t.*
  FROM mgadm.est_itenslistamateriais t
 WHERE EXISTS (SELECT 1
          FROM mgadm.est_produtos b
         WHERE b.pro_st_alternativo IN ('0001184', '0001016')
               AND b.pro_tab_in_codigo = t.com_tab_in_codigo
               AND b.pro_pad_in_codigo = t.com_pad_in_codigo
               AND b.pro_in_codigo = t.com_in_codigo)
       AND EXISTS (SELECT 1
          FROM mgadm.est_revisaolistamateriais d
         WHERE d.pro_tab_in_codigo = t.pro_tab_in_codigo
               AND d.pro_pad_in_codigo = t.pro_pad_in_codigo
               AND d.pro_in_codigo = t.pro_in_codigo
         GROUP BY d.pro_tab_in_codigo, d.pro_pad_in_codigo, d.pro_in_codigo
        HAVING MAX(d.lis_in_revisao) = t.lis_in_revisao);
Se quiser ver colunas de todas tabelas seria assim:

Selecionar tudo

SELECT t.*
  FROM mgadm.est_itenslistamateriais t
 INNER JOIN (SELECT pro_st_alternativo, pro_tab_in_codigo, pro_pad_in_codigo, pro_in_codigo
               FROM mgadm.est_produtos
              WHERE pro_st_alternativo IN ('0001184', '0001016')) b
    ON b.pro_tab_in_codigo = t.com_tab_in_codigo
       AND b.pro_pad_in_codigo = t.com_pad_in_codigo
       AND b.pro_in_codigo = t.com_in_codigo
 INNER JOIN (SELECT MAX(d.lis_in_revisao) max_lis_in_revisao
               FROM mgadm.est_revisaolistamateriais d
              GROUP BY d.pro_tab_in_codigo, d.pro_pad_in_codigo, d.pro_in_codigo) e
    ON e.pro_tab_in_codigo = t.pro_tab_in_codigo
       AND e.pro_pad_in_codigo = t.pro_pad_in_codigo
       AND e.pro_in_codigo = t.pro_in_codigo
       AND e.max_lis_in_revisao = t.lis_in_revisao;
Talvez eu tenha entendido algo errado... para clarear se não estiver correto, poste uns exemplos de dados para as tabelas e o retorno que você espera ver no select, de forma que a gente possa testar aqui e dar a resposta já na mão.

Abraço,
Francisco.
Responder
  • Informação
  • Quem está online

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