문제
나는 자기 주인의 필요성을 이해하지 못한다. 누군가 나에게 설명해 주시겠습니까?
간단한 예는 매우 도움이 될 것입니다.
해결책
자체 연합을 두 개의 동일한 테이블로 볼 수 있습니다. 그러나 정규화에서는 테이블의 두 부를 만들 수 없으므로 자체 합의로 두 개의 테이블을 시뮬레이션합니다.
두 개의 테이블이 있다고 가정합니다.
테이블 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
셀프 조인은 자체와 함께 테이블의 결합입니다.
일반적인 사용 사례는 테이블이 그들 사이에 계층 적 관계를 가진 엔티티 (레코드)를 저장하는 경우입니다.. 예를 들어 개인 정보 (이름, DOB, 주소 ...)가 포함 된 테이블과 아버지 (및/또는 어머니)의 신분증이 포함 된 열을 포함합니다. 그런 다음 작은 쿼리와 함께
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
아래에 설명 된대로. 모든 직원에게는 직원 인 관리자가 있습니다 (아마도 CEO를 제외하고는 Manager_ID가 Null이 될 수 있습니다)
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은 두 개의 별도 테이블로 취급하므로 모든 것이 한 곳에 멋지게 저장됩니다.
위에서 언급 한 답변과는 별도로 (매우 잘 설명되어 있음), 자체 결합의 사용을 쉽게 보여줄 수 있도록 한 예를 추가하고 싶습니다. CustomerID, CustomerName, ContactName, City, Country라는 속성이있는 고객이라는 테이블이 있다고 가정합니다. 이제 당신은 "같은 도시"에서 온 모든 사람들을 나열하고 싶습니다. 우리가 도시를 기준으로 그들과 함께 할 수 있도록이 테이블의 복제본을 생각해야합니다. 아래 쿼리는 그 의미를 명확하게 보여줍니다.
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를 원합니다
두 시나리오를 모두 아는 데있어 장점은 때때로 많은 위치 또는 가입 조건을 가지고 있으며 코드를 읽을 수 있도록 다른 조항에 자체 조건을 배치하려는 것입니다.
직원에게 관리자가 없을 때 어떤 일이 발생하는지 아무도 언급하지 않았습니다. 뭐? 결과 세트에는 포함되지 않습니다. 관리자가 없지만 잘못된 조합을 원하지 않는 직원을 포함시키려면 어떻게해야합니까?
이 강아지를 시도하십시오.
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
예를 들어, 초기 지정이 현재 지정과 같은 직원의 이름을 찾고자합니다. 우리는 다음과 같은 방식으로 자체 조인을 사용하여 이것을 해결할 수 있습니다.
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
링크 된 목록/트리와 동등한 데이터베이스이며 행에는 다른 행에 대한 일부 용량의 참조가 포함되어 있습니다.
다음은 평신도 용어로 자기 가입의 예방 적입니다. 셀프 조인은 다른 유형의 조인이 아닙니다. 다른 유형의 조인 (내부, 외부 및 크로스 조인)을 이해 한 경우 자체 조인이 간단해야합니다. 내부, 외부 및 크로스 결합에서는 2 개 이상의 다른 테이블에 합류합니다. 그러나 자체 가입에서는 ITSLEF와 동일한 테이블에 가입하십시오. 여기에는 2 개의 다른 테이블이 없지만 테이블 별명을 사용하여 동일한 테이블과 다른 테이블을 취급합니다. 이것이 여전히 명확하지 않으면 다음 YouTube 동영상을 시청할 것입니다.