sql >> Databáze >  >> RDS >> Oracle

Jak proměnit 2 dotazy se společnými sloupci (A, B) a (A, C) na jediný (A, B, C)?

Nejprve si představte, že ty 2 dotazy byly jen tabulky. Udělali byste toto:

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

Každou tabulku můžete nahradit dotazem (známým jako vložené zobrazení):

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;

Možná budete muset změnit mé „připojení“ na „plné vnější spojení“, pokud jeden dotaz může vrátit data pro producenta, zatímco druhý nikoli. Také bych se přikláněl k restrukturalizaci dotazu následujícím způsobem, přičemž hlavní dotaz na Producers external spojený s 2 dílčími dotazy (s odstraněnými Producers):

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;

(Je to tento typ dotazu, který jsem testoval níže).

Spíše než nafouknout tuto odpověď informacemi, které by OP pravděpodobně nezajímaly, jsou mé poznámky o relativním výkonu skalárních dílčích dotazů a inline pohledů v Oracle (požadované PerformanceDBA) nyní offline zde:Poznámky k výkonu



  1. Jaký je rozdíl mezi Scope_Identity(), Identity(), @@Identity a Ident_Current()?

  2. SQL Server – zahrňte NULL pomocí UNPIVOT

  3. Nejjednodušší způsob, jak přidat více mezer do řetězce v MySQL – SPACE()

  4. Zdroj dat MySQL se ve Visual Studiu nezobrazuje