셀프 조인의 필요성을 이해하지 못합니다. 누군가 나에게 설명해 주시겠습니까?
간단한 예가 매우 도움이 될 것입니다.
답변:
셀프 조인을 두 개의 동일한 테이블로 볼 수 있습니다. 그러나 정규화에서는 테이블의 복사본을 두 개 만들 수 없으므로 셀프 조인이있는 두 개의 테이블이있는 것을 시뮬레이션하면됩니다.
두 개의 테이블이 있다고 가정합니다.
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
left join
상사가없는 직원 (또는 상사)을 제외하지 않는 편이 낫다고 생각합니다. 최고 개!
자신을 참조하는 테이블이있는 경우 매우 일반적입니다. 예 : 모든 직원이 관리자를 가질 수 있고 모든 직원과 해당 관리자의 이름을 나열하려는 직원 테이블.
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
과 같이 설정된 테이블이 있다고 가정 해 보겠습니다 .
이 상황에서 사용자 정보 와 관리자 정보를 모두 하나의 쿼리 로 가져 오려면 다음 과 같이 할 수 있습니다.
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
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
위에서 언급 한 답변 (매우 잘 설명되어 있음) 외에도 Self Join의 사용을 쉽게 보여줄 수 있도록 한 가지 예를 추가하고 싶습니다. CustomerID, CustomerName, ContactName, City, Country 속성이있는 CUSTOMERS라는 테이블이 있다고 가정합니다. 이제 "같은 도시"에서 온 사람들을 모두 나열하려고합니다. 이 테이블의 복제본을 생각해야 CITY를 기준으로 조인 할 수 있습니다. 아래 쿼리는 그 의미를 명확하게 보여줍니다.
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;
여기에는 많은 정답이 있지만 똑같이 올바른 변형이 있습니다. 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
e1.manager_id> e2.id를 원할 때가 있습니다.
두 시나리오를 모두 아는 이점은 때때로 WHERE 또는 JOIN 조건이 많고 코드를 읽기 쉽게 유지하기 위해 다른 절에 자체 조인 조건을 배치하려는 것입니다.
직원에게 관리자가 없을 때 어떤 일이 발생하는지 아무도 언급하지 않았습니다. 어? 결과 세트에 포함되지 않습니다. 관리자가없는 직원을 포함하고 싶지만 잘못된 조합이 반환되는 것을 원하지 않으면 어떻게합니까?
이 강아지를 시도하십시오;
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
한 가지 사용 사례는 데이터베이스에서 중복 레코드를 확인하는 것입니다.
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
셀프 조인은 테이블의 데이터를 자체적으로 평가해야 할 때 유용합니다. 즉, 동일한 테이블의 행을 상호 연결합니다.
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
예를 들어 초기 지정이 현재 지정과 동일한 직원의 이름을 찾으려고합니다. 다음과 같은 방법으로 self join을 사용하여 해결할 수 있습니다.
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
다음은 평신도 용어로 자기 결합에 대한 설명입니다. 자체 조인은 다른 유형의 조인이 아닙니다. 다른 유형의 조인 (내부, 외부 및 교차 조인)을 이해했다면 자체 조인은 간단해야합니다. INNER, OUTER 및 CROSS JOINS에서 2 개 이상의 서로 다른 테이블을 조인합니다. 그러나 셀프 조인에서는 itslef와 동일한 테이블을 조인합니다. 여기에는 2 개의 다른 테이블이 없지만 테이블 별칭을 사용하여 동일한 테이블을 다른 테이블로 취급합니다. 이것이 여전히 명확하지 않다면 다음 유튜브 비디오를 보는 것이 좋습니다.