sql >> Database >  >> RDS >> Oracle

Hoe verander je 2 zoekopdrachten met gemeenschappelijke kolommen (A, B) en (A, C) in slechts één (A, B, C)?

Stel je eerst voor dat de 2 queries gewoon tabellen waren. Je zou dit doen:

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

U kunt elke tabel vervangen door een query (ook wel een inline-weergave genoemd):

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;

Mogelijk moet u mijn "join" wijzigen in "full outer join" als de ene query gegevens kan retourneren voor een producent waar de andere dat niet doet. Ik zou ook geneigd zijn om de query als volgt te herstructureren, waarbij een hoofdquery op Producers outer wordt samengevoegd met de 2 subquery's (met Producers verwijderd):

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;

(Van dit type zoekopdracht heb ik de prestaties hieronder getest).

In plaats van dit antwoord op te blazen met informatie die waarschijnlijk niet van belang is voor het OP, zijn mijn opmerkingen over de relatieve prestaties van scalaire subquery's en inline views in Oracle (op verzoek van PerformanceDBA) nu hier offline:Notes on Performance



  1. Is er een betere Oracle-operator om nulveilige gelijkheidscontrole uit te voeren?

  2. Een postgres-back-upbestand herstellen via de opdrachtregel?

  3. Mysqladmin flush-hosts uitvoeren op Amazon RDS

  4. rs.last() geeft ongeldige bewerking voor alleen doorsturen resultatenset:last