- 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
Deixe uma resposta