Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como transformar 2 consultas com colunas comuns (A, B) e (A, C) em apenas uma (A, B, C)?


Primeiro imagine que as 2 consultas eram apenas tabelas. Você faria isso:
select a.producer, a.firstquerycolumn, b.secondquerycolumn
from table1 a
join table2 b on b.producer = a.producer

Você pode substituir cada tabela por uma consulta (conhecida como visualização em linha):
select a.Prod, a.AnimalsBought, b.AnimalsExploration
from
( select Producers.name Prod, count(Animals.idanimal) AnimalsBought
  from AnimalsBought, Animals, Producers
  where (AnimalsBought.idanimal = Animals.idanimal) 
  and (Animals.owner = Producers.nif) 
  group by Producers.name
) a
join
( select Producers.name Prod, count(Animals.idanimal) AnimalsExploration
  from AnimalsExploration, Animals, Producers
  where (AnimalsExploration.idanimal = Animals.idanimal) 
  and (Animals.owner = Producers.nif)
  group by Producers.name
) b
on a.Prod = b.Prod;

Pode ser necessário alterar minha "junção" para "junção externa completa" se uma consulta puder retornar dados para um produtor onde a outra não. Eu também estaria inclinado a reestruturar a consulta da seguinte forma, fazendo uma consulta principal nos Produtores externos unidos às 2 subconsultas (com os Produtores removidos):
select Producers.name Prod, a.AnimalsBought, b.AnimalsExploration
from Producers
left outer join ( select Animals.owner, count(AnimalsBought.idanimal) AnimalsBought
                    from AnimalsBought, Animals
                   where AnimalsBought.idanimal = Animals.idanimal
                   group by Animals.owner
                ) a
           on a.owner = Producers.nif
left outer join ( select Animals.owner, count(Animals.idanimal) AnimalsExploration
                    from AnimalsExploration, Animals
                   where AnimalsExploration.idanimal = Animals.idanimal
                   group by Animals.owner
                ) b
           on b.owner = Producers.nif;

(É desse tipo de consulta que testei o desempenho abaixo).

Em vez de encher esta resposta com informações que provavelmente não interessam ao OP, minhas notas sobre o desempenho relativo de subconsultas escalares e visualizações em linha no Oracle (solicitadas pelo PerformanceDBA) agora estão offline aqui:Notas sobre o desempenho