Outer joins en SQL
17:30 H (CET)| Temas: Bases de datos · MYSQL
Hace días que llevo pensando en explicar cómo hacer un outer join en SQL (MySQL y Oracle), y hoy he encontrado unos diagramas que explican los diferentes tipos de joins que podemos hacer (MySQL).
El outer join se usa cuando queremos que obtener todos los campos de una tabla que cumplen una condición y los campos de otra tabla que coinciden con los de la primera tabla.

Imaginamos que tenemos una tabla de palabras en inglés y una tabla de traduciones:
Tabla : palabras id / palabra 1 / bird 2 / flower 3 / sky 4 / tree
Tabla: traducciones id / traduccion / idioma 1 / pájaro / es 3 / cielo / es
Se trata de tener la tabla de palabras y sus correspondientes traducciones (en este caso solo lo he hecho para español, pero se podrían incluir registros para otros idiomas). Si nos fijamos veremos que un join normal no lo podremos hacer porque si igualamos el id de palabras y traducciones habrá registros que no se mostrarán en la tabla de palabras porque no existen sus correspondientes en la tabla de traducciones. Por ello deberemos ejecutar las siguientes instrucciones en MySQL y Oracle:
/* MySQL */
SELECT *
FROM palabras
LEFT OUTER JOIN traducciones
ON palabras.id = traducciones.id
/* Oracle */
SELECT palabra, traduccion
FROM palabras, traducciones
WHERE palabras.id = traducciones.id (+)
Echadle un vistazo al resto de representaciones gráficas de los joins porque son muy aclaratorias.
A Visual Explanation of SQL Joins
Relacionados
Feedback (3) » Formulario
3. Gustavo ~ Jueves, 15 May 2008 | 16:27H:
SELECT prh.segment1 NUM_REQ
,prl.item_description descripcion
,prd.requisition_line_id -- TEMPORAL
,pd.req_distribution_id -- TEMPORAL
FROM po_requisition_headers_all prh
RIGHT OUTER JOIN po_requisition_lines_all prl ON prh.requisition_header_id = prl.requisition_header_id
RIGHT OUTER JOIN po_req_distributions_all prd ON prl.requisition_line_id = prd.requisition_line_id
RIGHT OUTER JOIN po_distributions_all pd ON prd.distribution_id = pd.req_distribution_id
WHERE TRUNC(prh.creation_date) >= :fecha_ini
AND TRUNC(prh.creation_date)
AND prh.segment1 >= nvl(:P_REQ_INI,prh.segment1)
AND prh.segment1
la tabla pd ya no tiene registro coincidente con la tabla prd, sin embargo no me trae el registro, tal vez este mal mi sintaxis, algun tip?

