Union all

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
bsf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 14 Nov 2012 10:00 am

Oi pessoal, vocês poderiam me ajudar a unir as queries abaixo? Estou tendo dificuldades pelo fato de usarem count ou group by e não consigo selecionar os campos que preciso. Tambem tenho duvida em qual operador usar "union" ou "union all ".


--C2

Selecionar tudo

SELECT count(*) from 
(select count(PESO)FROM 
PORTPA.TBL_PA_METAS_2013 A, 
PORTPA.TBL_PA_USUARIO B 
WHERE A.ID = B.LOGIN AND 
ID_CLARO NOT IN ('9203000p')AND 
B.DT_VAL_ANA_2013 IS NOT NULL AND 
B.DT_VAL_RESP_2013 IS NOT NULL HAVING SUM(PESO) > 100.1 OR 
SUM(PESO) < 99.9 OR 
SUM(PESO)IS NULL GROUP BY ID_CLARO, B.NOME)
---------******----------
--C5 -

Selecionar tudo

select count (*) from 
(select a.codigo,a.preenchimento from portpa.tbl_pa_METAS_2013 a 
where a.preenchimento = 'Sim'and  
ID NOT IN ('920300p')and 
a.codigo is not null group by a.codigo, a.preenchimento having count(*)> 1)
---------******----------
--C3 -

Selecionar tudo

select count(*)from
( SELECT distinct t.codigo,t.classificacao 
FROM PORTPA.TBL_PA_METAS_2013 T,portpa.tbl_pa_usuario U 
WHERE T.CLASSIFICACAO IS NULL and 
t.codigo is not null and 
t.id_claro NOT IN ('920300p')AND 
u.dt_val_ana_2013 is not null and 
u.dt_val_resp_2013 is not null)
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Primeiramente a diferença entre o UNION e o UNION ALL e a abrangência que se esperado resultado. Caso queira unir o resultado das duas queries, idenpendentemente da igualdade do resultado utilize o UNION ALL. Agora nas duas queries, caso no primeira exista registros repetidos ou identicos ao da segunda e você queira eliminar as igualdades, você utiliza o UNION.

Agora quanto a dificuldade que você está encontrando em utilizar as funções de agrupamento, é que as mesmas não podem ser utilizadas dentro do UNION/ALL.

Neste caso você teria que criar um nivelamento de queries para poder buscar esse valor do "lado de fora" do resultado do UNION/ALL. Exemplo:

Selecionar tudo


SELECT T.*
  FROM ( SELECT  T1.CAMPO1
                ,T1.CAMPO2
           FROM <TABELA1> T1
		 UNION ALL
		 SELECT T2.CAMPO1
		        ,T2.CAMPO2
		   FROM <TABELA2> T2  
       ) T
[INNER/LEFT/RIGHT]	   
[WHERE]	   
[GROUP BY]
[ORDER BY]

Veja se isto resolve o seu problema.

Espero ter ajudado.

Att.,
bsf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 14 Nov 2012 10:00 am

Entendi, Obrigado.
E quanto aos campos q vou precisar utilizar? as queries utilizam campos diferentes, fora mais campos q vou precisar incluir isso é possivel?
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Sim você pode utilizar nas tabelas utilizadas que você relacionará com o seu conjunto de UNION/ALL. Só deve se atentar aos relacionamentos para que não seja feito um plano cartesiano (CROSS JOIN).

Exemplo, vamos supor que os campos da tabela que você quer listar sejam de uma mesma tabela de dentro do seu conjunto ou de alguma outra tabela que se relacione com alguma do conjunto. Daí você vai ter que analisar a cardinalidade entre elas para saber qual relacionamento utilizar.

Selecionar tudo


SELECT T.*
       T3.*
  FROM ( SELECT  T1.CAMPO1 -- (pk)
                ,T1.CAMPO2
           FROM <TABELA1> T1
       UNION ALL
       SELECT T2.CAMPO1
              ,T2.CAMPO2
         FROM <TABELA2> T2  
       ) T
INNER JOIN <TABELA3> T3
   ON T.CAMPO1 = T3.CAMPO
[WHERE]      
[GROUP BY]
[ORDER BY]

Obs.: Eu abri um tópico (Relatório Master-Details SQL Sumarizado) recente sobre algumas dúvidas que eu estou em gerar um relatório 1:N sumarizado utilizando funções analíticas. Caso queira pode se basear no exemplo que postei;

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

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