sql >> Databasteknik >  >> RDS >> Oracle

Hur gör man två frågor med vanliga kolumner (A, B) och (A, C) till bara en (A, B, C)?

Föreställ dig först att de två frågorna bara var tabeller. Du skulle göra så här:

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

Du kan ersätta varje tabell med en fråga (känd som en in-line-vy):

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 kan behöva ändra min "join" till "full yttre sammanfogning" om en fråga kan returnera data för en producent där den andra inte gör det. Jag skulle också vara benägen att omstrukturera frågan enligt följande, genom att göra en huvudfråga på Producers yttre förenad med de två underfrågorna (med Producers borttagna):

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 är den här typen av fråga som jag testade prestandan för nedan).

Istället för att blåsa upp det här svaret med information som förmodligen inte är av intresse för OP, är mina anteckningar om den relativa prestandan för skalära delfrågor och inline-vyer i Oracle (begärd av PerformanceDBA) nu offline här:Notes on Performance



  1. SQL Server:Bifoga felaktig version 661

  2. Millisekunder i min DateTime ändras när den lagras i SQL Server

  3. Hjälp för MySQL-uppdateringsfall

  4. Hur man använder kommandot SQLite Dump