셀프 조인의 필요성을 이해하지 못합니다. 누군가 나에게 설명해 주시겠습니까?
간단한 예가 매우 도움이 될 것입니다.
답변
셀프 조인을 두 개의 동일한 테이블로 볼 수 있습니다. 그러나 정규화에서는 테이블의 복사본을 두 개 만들 수 없으므로 셀프 조인이있는 두 개의 테이블이있는 것을 시뮬레이션하면됩니다.
두 개의 테이블이 있다고 가정합니다.
표 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
이제 각 직원의 이름과 상사의 이름을 얻으려면 :
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
다음 표가 출력됩니다.
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
답변
자신을 참조하는 테이블이있는 경우 매우 일반적입니다. 예 : 모든 직원이 관리자를 가질 수 있고 모든 직원과 해당 관리자의 이름을 나열하려는 직원 테이블.
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
답변
자체 조인은 자신과 테이블의 조인입니다.
일반적인 사용 사례는 테이블이 항목 (레코드)간에 계층 적 관계가있는 항목을 저장하는 경우입니다 . 예를 들어 개인 정보 (이름, 생년월일, 주소 …)를 포함하고 아버지 (및 / 또는 어머니)의 ID가 포함 된 열을 포함하는 테이블이 있습니다. 그런 다음 다음과 같은 작은 쿼리로
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
동일한 쿼리에서 자녀와 아버지 (및 어머니, 두 번째 셀프 조인 등, 심지어 조부모 등)에 대한 정보를 얻을 수 있습니다.
답변
다음 users
과 같이 설정된 테이블이 있다고 가정 해 보겠습니다 .
- 사용자 ID
- 사용자 이름
- 사용자의 관리자 ID
이 상황에서 사용자 정보 와 관리자 정보를 모두 하나의 쿼리 로 가져 오려면 다음 과 같이 할 수 있습니다.
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
답변
테이블이 자기 참조 인 경우 유용합니다. 예를 들어 페이지 테이블의 경우 각 페이지에 next
및 previous
링크 가있을 수 있습니다 . 이는 동일한 테이블에있는 다른 페이지의 ID입니다. 어떤 시점에서 연속 된 페이지의 세 개를 얻으려면 동일한 테이블의 열 을 사용하여 next
및 previous
열에 대해 두 개의 자체 조인을 수행합니다 id
.
답변
Employee
아래에 설명 된 테이블이 있다고 상상해보십시오 . 모든 직원에게는 직원이기도 한 관리자가 있습니다 (Manager_id가 null 인 CEO 제외)
Table (Employee):
int id,
varchar name,
int manager_id
그런 다음 다음 선택을 사용하여 모든 직원과 관리자를 찾을 수 있습니다.
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
답변
테이블이 자신을 참조하는 기능이 없으면 계층 구조의 계층 수만큼 계층 수준에 대한 테이블을 만들어야합니다. 그러나 해당 기능을 사용할 수 있으므로 테이블을 자체에 조인하고 SQL은이를 두 개의 개별 테이블로 취급하므로 모든 것이 한 곳에 잘 저장됩니다.