• ¿Qué es una unión interna?
  • ¿Qué es una unión externa?
    • realizar uniones externas utilizando el símbolo ( + )

Al igual que prácticamente todas las bases de datos relacionales, Oracle permite generar consultas que combinan o JOIN filas de dos o más tablas para crear el conjunto de resultados finales., Si bien existen numerosos tipos de combinaciones que se pueden realizar, los más comunes son el INNER JOIN y el OUTER JOIN.

en este tutorial, exploraremos brevemente la diferencia entre INNER y OUTER JOIN y luego examinaremos el método abreviado que Oracle proporciona para realizar OUTER JOINS específicamente usando + símbolo del operador.

¿qué es una unión interior?,

An INNER JOIN en una base de datos relacional es simplemente la Unión de dos o más tablas en las que el resultado solo contendrá datos que cumplan todas las condiciones de unión.

Por ejemplo, aquí tenemos un básico library esquema con dos tablas: books y languages.,>

mientras tanto, nuestra tabla books tiene una fila language_id que para la mayoría, pero no todos, los libros simplemente contienen el language_id asociado con el idioma original publicado del libro:

SELECT * FROM booksORDER BY idFETCH FIRST 10 ROWS ONLY;id title author year_published language_id1 In Search of Lost Time Marcel Proust 1913 22 Ulysses James Joyce 1922 13 Don Quixote Miguel de Cervantes 1605 54 Moby Dick Herman Melville 1851 15 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 87 The Odyssey Homer -700 98 The Great Gatsby F. Scott Fitzgerald 1925 19 The Divine Comedy Dante Alighieri 1472 1010 Madame Bovary Gustave Flaubert 1857 2

en muchos casos, es posible que deseemos realizar un INNER JOIN de las tablas books y languages en lugar de div id=»ff6b23bd9e»> valor de cada libro, en realidad podemos ver ellanguage name en su lugar.,

SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bINNER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian

lo que es fundamental tener en cuenta aquí es que nuestro conjunto de resultados fue ligeramente diferente en las dos consultas anteriores. En la primera, simplemente enumeramos los primeros libros 10, pero en la consulta INNER JOIN solo estamos devolviendo resultados que cumplen todas las condiciones de ambas tablas. Por esta razón, el registro de Hamlet (que tiene un language_id valor null o vacío) es ignorado y no se devuelve en el resultado de nuestro INNER JOIN.,

¿qué es una unión externa?

en lugar de devolver exclusivamente los resultados que satisfacen todas las condiciones de unión de un INNER JOIN, un OUTER JOIN devuelve no solo los resultados que satisfacen todas las condiciones, sino también las filas de una tabla que no satisfacen la condición. La tabla que se elige para este » bypass «de requisitos condicionales está determinada por la direccionalidad o» lado»de la Unión, normalmente conocida como LEFT o RIGHT uniones externas.,

al definir un lado de su OUTER JOIN, está especificando qué tabla siempre devolverá su fila incluso si la tabla opuesta en el otro lado de la Unión tiene valores faltantes o null como parte de la condición de unión.,

por lo tanto, si realizamos la misma base JOIN como anteriormente para recuperar books y language names, sabemos que nuestra tabla books siempre debe devolver datos, por lo que nuestra JOIN side debe «apuntar hacia» nuestra tabla books, haciendo así que la tabla languages la tabla OUTER que estamos adjuntando a ella.,> excepto que la menor alteración:

SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bLEFT OUTER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English5 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French

Como era de esperar, por el uso de un LEFT OUTER JOIN en lugar de INNER JOIN, estamos obteniendo lo mejor de ambos mundos: No estamos omitiendo cualquier books registros (como Hamlet), simplemente porque el language_id valor null para ese registro, sin embargo, para todos los registros donde language_id existe, tenemos el formato agradable language name obtenido de nuestro languages tabla.,

realizar uniones externas Usando el símbolo ( + )

como se indica en la documentación oficial, Oracle proporciona un símbolo especial outer join operator (el símbolo +) que es una abreviatura para realizar OUTER JOINS.

en la práctica, el símbolo + se coloca directamente en la instrucción condicional y en el lado de la tabla opcional (la que puede contener valores vacíos o null dentro de la condicional).,

por lo tanto, podemos volver a escribir nuestra instrucción anterior LEFT OUTER JOIN usando el operador + como así:

los resultados son los mismos que el ejemplo estándar LEFT OUTER JOIN, por lo que no los incluiremos aquí. Sin embargo, hay un aspecto crítico a tener en cuenta sobre la sintaxis usando el operador + para OUTER JOINS.

el operador + debe estar en el lado izquierdo del signo condicional (a la izquierda del signo igual a =)., Por lo tanto, en este caso, porque queremos asegurarnos de que nuestra tabla languages es la tabla opcional que puede devolver valores null durante esta comparación, intercambiamos el orden de las tablas en este condicional, por lo que languages está a la izquierda (y es opcional) mientras que books está a la derecha.

Por último, debido a este reordenamiento de los lados de la tabla en el condicional cuando se utiliza el operador +, es importante darse cuenta de que lo anterior es simplemente una abreviatura de un RIGHT OUTER JOIN., Esto significa que este fragmento de la consulta:

FROM books b, library.languages lWHERE l.id (+)= b.language_id

…es idéntico a este:

FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id