• O que é uma junção interna?o que é uma junção exterior?
    • executando Ligações externas usando o símbolo ( + )

Como praticamente todas as bases de dados relacionais, Oracle permite que sejam geradas consultas que combinam ou JOIN linhas de duas ou mais tabelas para criar o conjunto de resultados final., Embora existam vários tipos de juntas que podem ser realizadas, as mais comuns são o INNER JOIN e o OUTER JOIN.

neste tutorial, vamos explorar brevemente a diferença entre o INNER e OUTER JOIN e, em seguida, examinar o método de taquigrafia Oracle fornece para a realização de OUTER JOINS especificamente usando o + operador símbolo.o que é uma junção interna?,

An INNER JOIN in a relational database is simply the joining of two or more tables in which the result will only contain data which satisfied all join conditions.

Por exemplo, aqui nós temos um básico library esquema com duas tabelas: books e languages.,>

Enquanto isso, o nosso books tabela tem uma language_id linha que para a maioria, mas não todos, os livros simplesmente contém o language_id associado com o original publicado língua do livro:

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

Em muitos casos, podemos desejar executar uma INNER JOIN de books e languages mesas, por isso, em vez de ver o sem sentido language_id valor de cada livro, podemos realmente ver o language name em vez disso.,

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

o que é crítico notar aqui é que o nosso conjunto de resultados foi ligeiramente diferente nas duas consultas acima. No primeiro, nós simplesmente listadas primeiro 10 livros, mas INNER JOIN consulta estamos apenas devolvendo resultados que satisfaçam todas as condições de ambas as tabelas. Por esta razão, o registro de Hamlet (que tem uma language_id valor null ou vazio) é ignorado e não devolveu o resultado de nosso INNER JOIN.,o que é uma junção exterior?

em Vez de exclusivamente de retornar resultados que satisfazem todas as condições de associação de uma INNER JOIN, uma OUTER JOIN retorna não apenas os resultados que satisfazem todas as condições, mas também retorna linhas de uma tabela que não satisfaz a condição. A tabela que é escolhido para essa “bypass” de condicional requisitos é determinada pela direcionalidade ou “lado” da associação, normalmente referido como LEFT ou RIGHT outer joins.,

Quando a definição de um lado para o OUTER JOIN, você está especificando que a tabela irá sempre retornar a sua linha, mesmo se a outra mesa, do outro lado da associação tem falta ou null valores como parte da associação de condição.,

Portanto, se fazemos a mesma base, JOIN acima para obter books e language names, sabemos que o nosso books tabela deve sempre retornar dados, assim, nosso JOIN lado deve “apontar para” o nosso books tabela, tornando, assim, o languages tabela OUTER tabela estamos anexando a ele.,> exceto que a menor alteração:

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

Conforme o esperado, utilizando um LEFT OUTER JOIN ao invés de INNER JOIN, estamos obtendo o melhor de ambos os mundos: Não estamos ignorando quaisquer books registros (como Hamlet), simplesmente porque o language_id valor null para esse registro, ainda, para todos os registros onde language_id existe, nós temos o bem formatado language name obtida a partir de nosso languages tabela.,

execução de Junções Externas Utilizando a (+) Símbolo

Conforme indicado na documentação oficial, a Oracle oferece um especial outer join operator (+ símbolo) que é um atalho para a execução de OUTER JOINS.

Na prática, o + símbolo é colocado diretamente na declaração condicional e do lado da mesa opcional (o que é permitido conter vazio ou null valores dentro da condicional).,

Portanto, podemos, mais uma vez reescrever nossa acima de LEFT OUTER JOIN instrução usando o + operador, como por exemplo:

os resultados são Os mesmos como o padrão LEFT OUTER JOIN exemplo acima, por isso não o vamos incluí-los aqui. No entanto, há um aspecto crítico a notar sobre a sintaxe usando o + operador paraOUTER JOINS.

o operador+ deve estar do lado esquerdo do sinal condicional (à esquerda do id

)., Portanto, neste caso, porque queremos garantir que o nosso languages mesa é a mesa opcional que pode retornar null valores durante esta comparação, trocamos a ordem das tabelas desta condicional, portanto, languages é a esquerda (e é opcional) enquanto books é o da direita.

por último, devido a esta reordenação dos lados da tabela no condicional ao usar o + operador, é importante perceber que o que está acima é simplesmente um atalho para uma RIGHT OUTER JOIN., Isto significa que este trecho da consulta:

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

…é efetivamente idêntica a esta:

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