[sql] 셀프 조인 설명

셀프 조인의 필요성을 이해하지 못합니다. 누군가 나에게 설명해 주시겠습니까?

간단한 예가 매우 도움이 될 것입니다.



답변

셀프 조인을 두 개의 동일한 테이블로 볼 수 있습니다. 그러나 정규화에서는 테이블의 복사본을 두 개 만들 수 없으므로 셀프 조인이있는 두 개의 테이블이있는 것을 시뮬레이션하면됩니다.

두 개의 테이블이 있다고 가정합니다.

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


답변

테이블이 자기 참조 인 경우 유용합니다. 예를 들어 페이지 테이블의 경우 각 페이지에 nextprevious링크 가있을 수 있습니다 . 이는 동일한 테이블에있는 다른 페이지의 ID입니다. 어떤 시점에서 연속 된 페이지의 세 개를 얻으려면 동일한 테이블의 열 을 사용하여 nextprevious열에 대해 두 개의 자체 조인을 수행합니다 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은이를 두 개의 개별 테이블로 취급하므로 모든 것이 한 곳에 잘 저장됩니다.