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

Hvordan forvandler man 2 forespørgsler med fælles kolonner (A, B) og (A, C) til kun én (A, B, C)?

Forestil dig først, at de 2 forespørgsler kun var tabeller. Du ville gøre dette:

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

Du kan erstatte hver tabel med en forespørgsel (kendt som en in-line visning):

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;

Du skal muligvis ændre mit "join" til "full outer join", hvis den ene forespørgsel kan returnere data for en producent, hvor den anden ikke gør. Jeg ville også være tilbøjelig til at omstrukturere forespørgslen på følgende måde, idet en hovedforespørgsel på Producers ydre forbindes med de 2 underforespørgsler (med Producers fjernet):

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;

(Det er denne type forespørgsel, jeg testede ydeevnen af ​​nedenfor).

I stedet for at blæse dette svar op med oplysninger, der sandsynligvis ikke er af interesse for OP'en, er mine noter om den relative ydeevne af skalære underforespørgsler og inline-visninger i Oracle (anmodet af PerformanceDBA) nu offline her:Noter om ydeevne



  1. Sådan opretter du forbindelse til en ekstern PostgreSQL-database via SSL med Python

  2. Lagret procedure i Oracle Eksempel med IN OUT parameter

  3. Hvad er forskellen mellem backtick og firkantet parentes i SQL-sætninger?

  4. Hvordan angives et portnummer i SQL Server-forbindelsesstrengen?