Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann man zwei Abfragen mit gemeinsamen Spalten (A, B) und (A, C) in nur eine (A, B, C) umwandeln?

Stellen Sie sich zunächst vor, die beiden Abfragen wären nur Tabellen. Sie würden dies tun:

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

Sie können jede Tabelle durch eine Abfrage ersetzen (bekannt als Inline-Ansicht):

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;

Möglicherweise müssen Sie meinen "Join" in "Full Outer Join" ändern, wenn eine Abfrage möglicherweise Daten für einen Produzenten zurückgibt, während die andere dies nicht tut. Ich würde auch dazu neigen, die Abfrage wie folgt umzustrukturieren, indem ich eine Hauptabfrage für Producers mit den beiden Unterabfragen (mit entfernten Producers) verknüpft mache:

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;

(Es ist diese Art von Abfrage, deren Leistung ich unten getestet habe).

Anstatt diese Antwort mit Informationen aufzublähen, die für das OP wahrscheinlich nicht von Interesse sind, sind meine Notizen zur relativen Leistung von skalaren Unterabfragen und Inline-Ansichten in Oracle (angefordert von PerformanceDBA) jetzt hier offline:Hinweise zur Leistung