문제

나는 자기 주인의 필요성을 이해하지 못한다. 누군가 나에게 설명해 주시겠습니까?

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

도움이 되었습니까?

해결책

자체 연합을 두 개의 동일한 테이블로 볼 수 있습니다. 그러나 정규화에서는 테이블의 두 부를 만들 수 없으므로 자체 합의로 두 개의 테이블을 시뮬레이션합니다.

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

테이블 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 동영상을 시청할 것입니다.

예제와 함께 자기 가입

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top