- ¿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
Deja una respuesta