Oracle
 sql >> Database >  >> RDS >> Oracle

Come trasformare 2 query con colonne comuni (A, B) e (A, C) in una sola (A, B, C)?

Per prima cosa immagina che le 2 query fossero solo tabelle. Faresti così:

select a.producer, a.firstquerycolumn, b.secondquerycolumn
from table1 a
join table2 b on b.producer = a.producer

Puoi sostituire ogni tabella con una query (nota come vista in linea):

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;

Potrebbe essere necessario modificare il mio "join" in "join esterno completo" se una query può restituire dati per un produttore mentre l'altra no. Sarei anche propenso a ristrutturare la query come segue, facendo una query principale sui Producer esterni uniti alle 2 sottoquery (con Producers rimossi):

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;

(È di questo tipo di query che ho testato le prestazioni di seguito).

Piuttosto che gonfiare questa risposta con informazioni probabilmente non di interesse per l'OP, le mie note sulle prestazioni relative delle sottoquery scalari e delle viste inline in Oracle (richieste da PerformanceDBA) sono ora offline qui:Note sulle prestazioni