sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo convertir 2 consultas con columnas comunes (A, B) y (A, C) en una sola (A, B, C)?

Primero imagine que las 2 consultas eran solo tablas. Harías esto:

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

Puede reemplazar cada tabla por una consulta (conocida como vista en línea):

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;

Es posible que deba cambiar mi "unión" a "unión externa completa" si una consulta puede devolver datos para un productor donde la otra no lo hace. También me inclinaría a reestructurar la consulta de la siguiente manera, haciendo una consulta principal sobre los productores externa unida a las 2 subconsultas (con los productores eliminados):

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 este tipo de consulta que probé el rendimiento a continuación).

En lugar de inflar esta respuesta con información que probablemente no sea de interés para el OP, mis notas sobre el rendimiento relativo de las subconsultas escalares y las vistas en línea en Oracle (solicitadas por PerformanceDBA) ahora están fuera de línea aquí:Notas sobre el rendimiento