Não entendo a necessidade de auto-junções. Alguém pode explicar para mim?
Um exemplo simples seria muito útil.
Você pode ver a auto-junção como duas tabelas idênticas. Mas na normalização, você não pode criar duas cópias da tabela, portanto, apenas simule duas tabelas com auto-junção.
Suponha que você tenha duas tabelas:
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Agora, se você deseja obter o nome de cada funcionário com os nomes de seu chefe:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
O que resultará na seguinte tabela:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
É bastante comum quando você tem uma tabela que faz referência a si mesma. Exemplo: uma tabela de funcionários onde cada funcionário pode ter um gerente, e você deseja listar todos os funcionários e o nome de seu gerente.
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
Uma junção automática é uma junção de uma tabela consigo mesma.
Um caso de uso comum é quando a tabela armazena entidades (registros) que possuem uma relação hierárquica entre elas . Por exemplo, uma tabela contendo informações pessoais (nome, data de nascimento, endereço ...) e incluindo uma coluna onde o ID do pai (e / ou da mãe) está incluído. Então, com uma pequena consulta como
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago' -- Or some other condition or none
podemos obter informações sobre o filho e o pai (e a mãe, com um segundo self join etc. e até mesmo os avós etc ...) na mesma consulta.
Digamos que você tenha uma mesa users
, configurada assim:
Nessa situação, se você quiser extrair as informações do usuário e as do gerente em uma consulta, pode fazer o seguinte:
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
Eles são úteis se sua tabela for autorreferencial. Por exemplo, para uma tabela de páginas, cada página pode ter um link next
e previous
. Esses seriam os IDs de outras páginas na mesma tabela. Se em algum ponto você quiser obter um triplo de páginas sucessivas, você fará duas autojunções nas colunas next
e previous
com a mesma id
coluna da tabela .
Imagine uma tabela chamada Employee
conforme descrito abaixo. Todos os funcionários têm um gerente que também é funcionário (talvez exceto o CEO, cujo manager_id seria nulo)
Table (Employee):
int id,
varchar name,
int manager_id
Você pode então usar o seguinte selecionar para localizar todos os funcionários e seus gerentes:
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
Sem a capacidade de uma tabela fazer referência a si mesma, teríamos que criar tantas tabelas para níveis de hierarquia quanto o número de camadas na hierarquia. Mas, como essa funcionalidade está disponível, você associa a tabela a ela mesma e o sql a trata como duas tabelas separadas, de modo que tudo é armazenado em um só lugar.
Além das respostas mencionadas acima (que estão muito bem explicadas), gostaria de acrescentar um exemplo para que o uso do Self Join possa ser facilmente mostrado. Suponha que você tenha uma tabela chamada CUSTOMERS com os seguintes atributos: CustomerID, CustomerName, ContactName, City, Country. Agora você deseja listar todos aqueles que são da "mesma cidade". Você terá que pensar em uma réplica desta tabela para que possamos juntá-los com base em CITY. A consulta abaixo mostrará claramente o que significa:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2,
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
Existem muitas respostas corretas aqui, mas há uma variação que é igualmente correta. Você pode colocar suas condições de junção na instrução de junção em vez da cláusula WHERE.
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id
Lembre-se de que às vezes você deseja e1.manager_id> e2.id
A vantagem de saber os dois cenários é que às vezes você tem uma tonelada de condições WHERE ou JOIN e deseja colocar suas condições de self join na outra cláusula para manter seu código legível.
Ninguém abordou o que acontece quando um funcionário não tem um gerente. Hã? Eles não estão incluídos no conjunto de resultados. E se você quiser incluir funcionários que não têm gerentes, mas não quiser que combinações incorretas sejam retornadas?
Experimente este cachorrinho;
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2
ON e1.emp_id = e2.emp_id
AND e1.emp_name = e2.emp_name
AND e1.every_other_matching_column = e2.every_other_matching_column
Um caso de uso é verificar se há registros duplicados em um banco de dados.
SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id
A auto-junção é útil quando você precisa avaliar os dados da tabela com ela mesma. O que significa que ele correlacionará as linhas da mesma tabela.
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
Por exemplo, queremos encontrar os nomes dos funcionários cuja designação inicial é igual à designação atual. Podemos resolver isso usando self join da seguinte maneira.
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
É o equivalente do banco de dados a uma lista / árvore vinculada, onde uma linha contém uma referência de alguma forma a outra linha.
Aqui está a explicação de self join em termos leigos. A autojunção não é um tipo diferente de união. Se você entendeu outros tipos de junções (Inner, Outer e Cross Joins), então a self join deve ser direta. Em INNER, OUTER e CROSS JOINS, você junta 2 ou mais tabelas diferentes. No entanto, em self join, você se junta à mesma mesa com ela mesma. Aqui, não temos 2 tabelas diferentes, mas tratamos a mesma tabela como uma tabela diferente usando apelidos de tabela. Se isso ainda não está claro, eu recomendo assistir os seguintes vídeos do youtube.
left join
Acho melhor não deixar de fora o empregado (ou patrão) que não tem patrão; o cão superior!