복붙노트

[SQL] 설명 자체 조인

SQL

설명 자체 조인

자기 조인을 위해 내가 필요를 이해하지 않습니다. 누군가가 나에게 설명해 주시겠습니까?

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

해결법

  1. ==============================

    1.당신은 자아에 가입 볼 두 개의 동일한 테이블로 할 수 있습니다. 당신은 단지 두 개의 테이블을 가지고 시뮬레이션 할 수 있도록 그러나 정상화에, 당신은 테이블의 두 복사본을 만들 수 없습니다 자체 조인.

    당신은 자아에 가입 볼 두 개의 동일한 테이블로 할 수 있습니다. 당신은 단지 두 개의 테이블을 가지고 시뮬레이션 할 수 있도록 그러나 정상화에, 당신은 테이블의 두 복사본을 만들 수 없습니다 자체 조인.

    두 개의 테이블이 있다고 가정하자 :

    Id Name Boss_id            
    1   ABC   3                   
    2   DEF   1                   
    3   XYZ   2                   
    
    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
    
  2. ==============================

    2.자신을 참조하는 것이 테이블을 때 그것은 매우 일반적입니다. 예 : 모든 직원이 관리자를 가질 수 있으며 모든 직원과 관리자의 이름을 나열 할 직원 테이블.

    자신을 참조하는 것이 테이블을 때 그것은 매우 일반적입니다. 예 : 모든 직원이 관리자를 가질 수 있으며 모든 직원과 관리자의 이름을 나열 할 직원 테이블.

    SELECT e.name, m.name
    FROM employees e LEFT OUTER JOIN employees m
    ON e.manager = m.id
    
  3. ==============================

    3.자체 조인은 자체와 테이블의 조인입니다.

    자체 조인은 자체와 테이블의 조인입니다.

    테이블 저장 엔티티 (기록)하는 그들 사이의 계층 적 관계를 가질 때 일반적인 사용 방법이다. 예를 들어 테이블에 포함 된 개인 정보 (이름, 생년월일, 주소 ...)와 아버지 (및 / 또는 어머니)의 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
    

    우리는 같은 쿼리 (두 번째 자체 가입 등 심지어 그랜드 부모 등 ...와, 어머니) 자녀와 아버지 모두에 대한 정보를 얻을 수 있습니다.

  4. ==============================

    4.하자 당신과 같이 설정 테이블 사용자가 있다고 가정 :

    하자 당신과 같이 설정 테이블 사용자가 있다고 가정 :

    당신이 사용자의 정보를 하나 개의 쿼리에서 관리자의 정보를 모두 꺼내하고자한다면이 상황에서, 당신은이 작업을 수행 할 수 있습니다 :

    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
    
  5. ==============================

    5.테이블이 자기 참조 경우 그들은 유용합니다. 예를 들어, 페이지의 테이블에 대해, 각 페이지는 다음 및 이전 링크가있을 수 있습니다. 다음은 같은 테이블의 다른 페이지의 ID가 될 것입니다. 어떤 시점에서 당신은 연속 된 페이지의 트리플을 얻고 싶은 경우에, 당신은이 같은 테이블의 ID 열이있는 다음 및 이전 칼럼에서 자체 조인 할 것입니다.

    테이블이 자기 참조 경우 그들은 유용합니다. 예를 들어, 페이지의 테이블에 대해, 각 페이지는 다음 및 이전 링크가있을 수 있습니다. 다음은 같은 테이블의 다른 페이지의 ID가 될 것입니다. 어떤 시점에서 당신은 연속 된 페이지의 트리플을 얻고 싶은 경우에, 당신은이 같은 테이블의 ID 열이있는 다음 및 이전 칼럼에서 자체 조인 할 것입니다.

  6. ==============================

    6.아래에 설명 된대로 직원라는 테이블을 상상해보십시오. 모든 직원은 또한 직원 인 매니저가 (어쩌면 그 MANAGER_ID 것 널 (null), 대표 이사 제외)

    아래에 설명 된대로 직원라는 테이블을 상상해보십시오. 모든 직원은 또한 직원 인 매니저가 (어쩌면 그 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
    
  7. ==============================

    7.자신을 참조하는 테이블에 대한 능력이 없다면, 우리는 계층 구조 층의 수와 같은 계층 구조 수준에 대한 많은 테이블로 만들어야 할 것입니다. 해당 기능을 사용할 수 있기 때문에 모든 것을 한 곳에서 잘 저장되도록, 당신은 자신과 두 개의 별도의 테이블로 SQL 취급에 테이블을 가입 할 수 있습니다.

    자신을 참조하는 테이블에 대한 능력이 없다면, 우리는 계층 구조 층의 수와 같은 계층 구조 수준에 대한 많은 테이블로 만들어야 할 것입니다. 해당 기능을 사용할 수 있기 때문에 모든 것을 한 곳에서 잘 저장되도록, 당신은 자신과 두 개의 별도의 테이블로 SQL 취급에 테이블을 가입 할 수 있습니다.

  8. ==============================

    8.그렇다 (매우 잘 설명되어 있습니다) 위에서 언급 한 답변에서, 나는 자기의 사용을 쉽게 표시 할 수 있습니다 가입 있도록 하나의 예를 추가하고 싶습니다. 다음과 같은 속성이 있습니다 CUSTOMERS라는 테이블이 있다고 가정 : CustomerID를, CUSTOMERNAME, 연락처 이름, 도시, 국가. 지금 당신은 "같은 도시"에서있는 모든 사람들을 나열합니다. 당신은 우리가시를 기준으로 그들과 합류 할 수 있도록이 테이블의 복제를 생각해야합니다. 쿼리는 다음과 명확하게 무엇을 의미하는지 보여줄 것이다 :

    그렇다 (매우 잘 설명되어 있습니다) 위에서 언급 한 답변에서, 나는 자기의 사용을 쉽게 표시 할 수 있습니다 가입 있도록 하나의 예를 추가하고 싶습니다. 다음과 같은 속성이 있습니다 CUSTOMERS라는 테이블이 있다고 가정 : CustomerID를, CUSTOMERNAME, 연락처 이름, 도시, 국가. 지금 당신은 "같은 도시"에서있는 모든 사람들을 나열합니다. 당신은 우리가시를 기준으로 그들과 합류 할 수 있도록이 테이블의 복제를 생각해야합니다. 쿼리는 다음과 명확하게 무엇을 의미하는지 보여줄 것이다 :

    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;
    
  9. ==============================

    9.많은 정답이 여기 있습니다, 그러나 동등 올바른 변화가있다. (가) 대신 WHERE 절의 문을 조인 당신은 당신의 가입 조건을 배치 할 수 있습니다.

    많은 정답이 여기 있습니다, 그러나 동등 올바른 변화가있다. (가) 대신 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 또는 톤을 가지고 있고 당신이 당신의 코드를 읽을 수를 유지하기 위해 자기를 배치 할 다른 절에 조인 조건을 가끔합니다.

    아무도 직원이 관리자가없는 때 발생 해결 없습니다. 응? 그들은 결과 집합에 포함되지 않습니다. 당신이 관리자가없는 직원을 포함 할 수 있지만이 잘못된 조합을 반환하지 않으려면?

    이 강아지를보십시오;

    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
    
  10. ==============================

    10.하나의 유스 케이스는 데이터베이스에서 중복 레코드를 확인합니다.

    하나의 유스 케이스는 데이터베이스에서 중복 레코드를 확인합니다.

    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
    
  11. ==============================

    11.당신이 자체 테이블의 데이터를 평가해야 할 때 유용 자체 조인. 어떤이 같은 테이블에서 행의 상관 관계를 것을 의미한다.

    당신이 자체 테이블의 데이터를 평가해야 할 때 유용 자체 조인. 어떤이 같은 테이블에서 행의 상관 관계를 것을 의미한다.

    구문 : 테이블 T1 FROM SELECT * TABLE WHERE t1.columnName T2 = t2.columnName

    예를 들어, 우리는 초기 지정 현재 지정에 동일 직원의 이름을 찾고 싶어요. 우리는 자기 방식을 다음에 참여하여이 문제를 해결할 수 있습니다.

    SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
    
  12. ==============================

    12.이 행이 다른 행에 약간의 용량에 대한 참조를 포함하는 연결리스트 / 트리의 데이터베이스에 해당합니다.

    이 행이 다른 행에 약간의 용량에 대한 참조를 포함하는 연결리스트 / 트리의 데이터베이스에 해당합니다.

  13. ==============================

    13.자기가 평신도의 관점에서 참여의 여기 exaplanation입니다. 셀프 조인의 다른 유형이 아닌 가입 할 수 있습니다. (내부, 외부, 그리고 크로스 조인) 조인의 다른 유형을 이해하면, 자기는 정직해야 가입 할 수 있습니다. INNER, OUTER 및 CROSS 조인에서는 2 개 이상의 서로 다른 테이블을 조인. 자체 조인 그러나 itslef과 같은 테이블을 가입 할 수 있습니다. 여기, 우리는 2 개 개의 다른 테이블을 가지고 있지만, 테이블 별칭을 사용하여 다른 테이블과 같은 테이블을 취급하지 않습니다. 이 여전히 명확하지 않으면, 나는 다음과 같은 유튜브 비디오를 시청할 권 해드립니다 것이다.

    자기가 평신도의 관점에서 참여의 여기 exaplanation입니다. 셀프 조인의 다른 유형이 아닌 가입 할 수 있습니다. (내부, 외부, 그리고 크로스 조인) 조인의 다른 유형을 이해하면, 자기는 정직해야 가입 할 수 있습니다. INNER, OUTER 및 CROSS 조인에서는 2 개 이상의 서로 다른 테이블을 조인. 자체 조인 그러나 itslef과 같은 테이블을 가입 할 수 있습니다. 여기, 우리는 2 개 개의 다른 테이블을 가지고 있지만, 테이블 별칭을 사용하여 다른 테이블과 같은 테이블을 취급하지 않습니다. 이 여전히 명확하지 않으면, 나는 다음과 같은 유튜브 비디오를 시청할 권 해드립니다 것이다.

    자기는 예와 함께 가입

  14. from https://stackoverflow.com/questions/2458519/explanation-of-self-joins by cc-by-sa and MIT license