Como utilizar a associação externa SQL
Quando você está se juntando duas tabelas SQL, o primeiro (chamemos-lhe o outro à esquerda) pode ter linhas que não têm contrapartidas correspondentes na segunda tabela (a da direita). Por outro lado, a tabela à direita pode ter linhas que não têm contrapartidas correspondentes na tabela à esquerda.
Se você executar uma junção interna nessas tabelas, todas as linhas ímpares são excluídos da saída. Associações externas, no entanto, não exclui as linhas ímpares. Associações externas vêm em três tipos: a junção externa esquerda, se juntar ao exterior direita, ea junção externa completa.
Deixou junção externa
Numa consulta que inclui uma junção, a tabela à esquerda é a que precede a palavra-chave JUNTE-SE, e a mesa certa é a que segue. o LEFT JOIN externa preserva as linhas sem correspondência da tabela da esquerda, mas descarta linhas não correspondentes da tabela direita.
Para compreender associações externas, considere um banco de dados corporativo que mantém registros de empregados, departamentos e locais da empresa.
LOCATION_ID | CIDADE |
---|---|
1 | Boston |
3 | Tampa |
5 | Chicago |
Aqui, a empresa rastreia os departamentos.
DEPT_ID | LOCATION_ID | NOME |
---|---|---|
21 | 1 | Vendas |
24 | 1 | administrador |
27 | 5 | Reparar |
29 | 5 | estoque |
Aqui, a empresa rastreia os funcionários.
EMP_ID | DEPT_ID | NOME |
---|---|---|
61 | 24 | igreja |
63 | 27 | McCoy |
Agora, suponha que você quer ver todos os dados para todos os funcionários, incluindo departamento e localização. Você começa este com uma equi-join:
* SELECT FROM LOCALIZAÇÃO L, DEPT D, FUNCIONÁRIO EWHERE L.LocationID = D.LocationIDAND D.DeptID = E.DeptID -
Esta declaração produz o seguinte resultado:
1 Boston 24 1 Administrador 61 24 Kirk5 Chicago 27 5 Repair 63 27 McCoy
Esta tabela resultado dá todos os dados para todos os funcionários, incluindo a localização e departamento. O equi-join funciona porque cada funcionário tem um local e um departamento.
Em seguida, suponha que você deseja que os dados sobre os locais, com os dados de departamento e funcionários relacionados. Este é um problema diferente, porque uma localização sem quaisquer serviços associados podem existir. Para conseguir o que você quer, você tem que usar uma associação externa, como no exemplo a seguir:
SELECT * DE LOCALIZAÇÃO L LEFT OUTER JOIN DEPT DON (L.LocationID = D.LocationID) LEFT OUTER JOIN EMPREGADOS EON (D.DeptID = E.DeptID) -
Esta unir dados puxa a partir de três tabelas. Em primeiro lugar, a tabela a localização é unida a tabela DEPT. O conjunto de resultados é, então, juntou-se à tabela EMPLOYEE. Linhas da tabela à esquerda do LEFT OUTER JOIN operador que não tem nenhuma linha correspondente na tabela à direita são incluídos no resultado.
Assim, no primeiro unir-se, todos os locais são incluídos, mesmo se nenhum departamento associado com eles existe. Na segunda juntar-se, todos os departamentos estão incluídas, mesmo que nenhum funcionário que lhes estão associados existe. O resultado é o seguinte:
1 Boston 24 1 Administrador 61 24 Kirk5 Chicago 27 5 Repair 63 27 McCoy3 Tampa NULL NULL NULL NULL NULL NULL5 Chicago 29 5 Stock NULL NULL NULL1 Boston 21 1 Vendas NULL NULL NULL
As duas primeiras linhas são as mesmas que as duas linhas de resultado no exemplo anterior. A terceira linha (3 Tampa) Tem valores nulos nas colunas de departamento e funcionários, porque não há departamentos são definidos para Tampa e sem empregados estão estacionados lá.
A quarta e quinta linhas (5 Chicago e 1 Boston) Conter dados sobre o estoque e a Vendas departamentos, mas o Empregado colunas para estas linhas contêm valores nulos, porque esses dois departamentos não têm empregados. Esta junção externa diz-lhe tudo o que o equi-se juntarem a você disse - mais o seguinte:
Todos os locais da empresa, se eles têm quaisquer departamentos ou não
Todos os departamentos da empresa, se eles têm todos os empregados ou não
As linhas retornadas no exemplo anterior não são garantidos para ser na ordem que você quiser. A ordem pode variar de uma aplicação para a seguinte. Para certificar-se de que as linhas retornadas estão na ordem que você quiser, adicione um ORDENAR POR cláusula para a sua SELECIONAR declaração, como este:
SELECT * DE LOCALIZAÇÃO L LEFT OUTER JOIN DEPT DON (L.LocationID = D.LocationID) LEFT OUTER JOIN EMPREGADOS EON (D.DeptID = E.DeptID) ORDER BY L.LocationID, D.DeptID, E.EmpID-
Você pode abreviar a junção externa esquerda linguagem como LEFT JOIN porque não há tal coisa como uma esquerda interior Junte-se.
Direito de associação externa
o direito de associação externa preserva as linhas sem correspondência da tabela à direita, mas descarta linhas não correspondentes da tabela esquerda. Você pode usá-lo nas mesmas tabelas e obter o mesmo resultado, invertendo a ordem em que você apresenta tabelas para a união:
SELECT * FROM EMPREGADOS E RIGHT OUTER JOIN DEPT DON (D.DeptID = E.DeptID) RIGHT OUTER JOIN LOCALIZAÇÃO LON (L.LocationID = D.LocationID) -
Nesta formulação, o primeiro aderir produz uma tabela que contém todos os departamentos, se eles têm um empregado associada ou não. A segunda junção produzirá uma tabela que contém todos os locais, se eles têm um departamento associada ou não.
Você pode abreviar a junção externa direita linguagem como RIGHT JOIN porque não há tal coisa como um direito interior Junte-se.
junção externa completa
o junção externa completa combina as funções da associação externa à esquerda e à junção externa direita. Ele retém as linhas sem correspondência de ambas as tabelas da esquerda e da direita. Consideremos o caso mais geral da base de dados da empresa utilizados nos exemplos precedentes. Pode ter
Locais sem departamentos
Departamentos com nenhum local
Departamentos sem funcionários
Empregados sem departamentos
Para mostrar todos os locais, departamentos e colaboradores, independentemente de se eles têm linhas correspondentes nas outras mesas, usar uma associação externa completa na seguinte forma:
SELECT * DE LOCALIZAÇÃO L FULL OUTER Cadastre DEPT DON (L.LocationID = D.LocationID) FULL OUTER JOIN EMPREGADOS EON (D.DeptID = E.DeptID) -
Você pode abreviar o full-outer-join linguagem como full join porque não há tal coisa como um completo interior Junte-se.