Estoy tratando de aprender el estándar ansi-92 SQL, pero parece que no lo entiendo completamente (soy nuevo en el estándar ansi-89 y en las bases de datos en general).¿Entiendo mal las uniones?
En mi ejemplo, tengo tres tablas reino - familia < - < especies (clasificaciones de biología).
- Puede haber reinos sin especies ni familias.
- Puede haber familias sin especie ni cariño.
- Puede haber especies sin reino o familias.
¿Por qué esto puede pasar?
dicen que un biólogo, descubre una nueva especie, pero que no ha clasificado esta en un reino o familia, crea una nueva familia que no tiene especie y no está seguro de lo que debería pertenecer reino, etc.
aquí es un violín (ver la última consulta): http://sqlfiddle.com/#!4/015d1/3
Quiero hacer una consulta que me devuelva todos los reinos, todas las especies, pero no las familias que no tienen ninguna especie, así que hago esto.
select *
from reino r
left join (
familia f
right join especie e
on f.fnombre = e.efamilia
and f.freino = e.ereino
) on r.rnombre = f.freino
and r.rnombre = e.ereino;
Lo que creo que esto podría hacer es:
se unen a la familia y la especie como un derecho unirse, lo que trae cada especie, pero no aquellas familias que no tienen especies. Por lo tanto, si una especie no se ha clasificado en una familia, aparecerá con nulo en la familia.
Luego, únete al reino con el resultado como un join de la izquierda, por lo que trae a cada reino, incluso si no hay familias o especies clasificadas en ese reino.
Am I wrong? ¿No debería esto mostrarme las especies que no han sido clasificadas? Si hago la consulta interna, trae lo que quiero. ¿Hay algún problema cuando estoy agrupando cosas?
¿Esto se mete con la optimización de consulta que Oracle no ?, en mi consulta, son innecesarias paréntesis? ¿obtengo el mismo resultado? ¿Cuál es el orden que oráculo hace las instrucciones? – Roger
@outis Debo discrepar respetuosamente de que la sintaxis de unión no anida. [Creo que este artículo aborda este tema] (http://tonyhasler.wordpress.com/2009/02/22/parentheses-in-ansi-join-syntax/) y concluye que los paréntesis se pueden usar para aclarar el orden de operaciones al unir múltiples tablas. –
@MichaelFredrickson: Estoy corregido. Ahí está, SQL/Foundation § 7.6. – outis