Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment transformer 2 requêtes avec des colonnes communes (A, B) et (A, C) en une seule (A, B, C) ?

Imaginez d'abord que les 2 requêtes n'étaient que des tables. Vous feriez ceci :

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

Vous pouvez remplacer chaque tableau par une requête (appelée vue en ligne) :

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;

Vous devrez peut-être changer ma "jointure" en "jointure externe complète" si une requête peut renvoyer des données pour un producteur là où l'autre ne le fait pas. Je serais également enclin à restructurer la requête comme suit, en créant une requête principale sur Producers externe jointe aux 2 sous-requêtes (avec Producers supprimés) :

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;

(C'est ce type de requête dont j'ai testé les performances ci-dessous).

Plutôt que de gonfler cette réponse avec des informations probablement sans intérêt pour l'OP, mes notes sur les performances relatives des sous-requêtes scalaires et des vues en ligne dans Oracle (demandées par PerformanceDBA) sont maintenant hors ligne ici :Notes sur les performances