Não entendo a necessidade de auto-junções. Alguém pode explicar para mim?
Um exemplo simples seria muito útil.
Não entendo a necessidade de auto-junções. Alguém pode explicar para mim?
Um exemplo simples seria muito útil.
Respostas:
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
left join
Acho melhor não deixar de fora o empregado (ou patrão) que não tem patrão; o cão superior!
É 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.