[SQL] 설명 자체 조인
SQL설명 자체 조인
자기 조인을 위해 내가 필요를 이해하지 않습니다. 누군가가 나에게 설명해 주시겠습니까?
간단한 예는 매우 도움이 될 것입니다.
해결법
-
==============================
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.자신을 참조하는 것이 테이블을 때 그것은 매우 일반적입니다. 예 : 모든 직원이 관리자를 가질 수 있으며 모든 직원과 관리자의 이름을 나열 할 직원 테이블.
자신을 참조하는 것이 테이블을 때 그것은 매우 일반적입니다. 예 : 모든 직원이 관리자를 가질 수 있으며 모든 직원과 관리자의 이름을 나열 할 직원 테이블.
SELECT e.name, m.name FROM employees e LEFT OUTER JOIN employees m ON e.manager = m.id
-
==============================
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.하자 당신과 같이 설정 테이블 사용자가 있다고 가정 :
하자 당신과 같이 설정 테이블 사용자가 있다고 가정 :
당신이 사용자의 정보를 하나 개의 쿼리에서 관리자의 정보를 모두 꺼내하고자한다면이 상황에서, 당신은이 작업을 수행 할 수 있습니다 :
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.테이블이 자기 참조 경우 그들은 유용합니다. 예를 들어, 페이지의 테이블에 대해, 각 페이지는 다음 및 이전 링크가있을 수 있습니다. 다음은 같은 테이블의 다른 페이지의 ID가 될 것입니다. 어떤 시점에서 당신은 연속 된 페이지의 트리플을 얻고 싶은 경우에, 당신은이 같은 테이블의 ID 열이있는 다음 및 이전 칼럼에서 자체 조인 할 것입니다.
테이블이 자기 참조 경우 그들은 유용합니다. 예를 들어, 페이지의 테이블에 대해, 각 페이지는 다음 및 이전 링크가있을 수 있습니다. 다음은 같은 테이블의 다른 페이지의 ID가 될 것입니다. 어떤 시점에서 당신은 연속 된 페이지의 트리플을 얻고 싶은 경우에, 당신은이 같은 테이블의 ID 열이있는 다음 및 이전 칼럼에서 자체 조인 할 것입니다.
-
==============================
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.자신을 참조하는 테이블에 대한 능력이 없다면, 우리는 계층 구조 층의 수와 같은 계층 구조 수준에 대한 많은 테이블로 만들어야 할 것입니다. 해당 기능을 사용할 수 있기 때문에 모든 것을 한 곳에서 잘 저장되도록, 당신은 자신과 두 개의 별도의 테이블로 SQL 취급에 테이블을 가입 할 수 있습니다.
자신을 참조하는 테이블에 대한 능력이 없다면, 우리는 계층 구조 층의 수와 같은 계층 구조 수준에 대한 많은 테이블로 만들어야 할 것입니다. 해당 기능을 사용할 수 있기 때문에 모든 것을 한 곳에서 잘 저장되도록, 당신은 자신과 두 개의 별도의 테이블로 SQL 취급에 테이블을 가입 할 수 있습니다.
-
==============================
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.많은 정답이 여기 있습니다, 그러나 동등 올바른 변화가있다. (가) 대신 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.하나의 유스 케이스는 데이터베이스에서 중복 레코드를 확인합니다.
하나의 유스 케이스는 데이터베이스에서 중복 레코드를 확인합니다.
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.당신이 자체 테이블의 데이터를 평가해야 할 때 유용 자체 조인. 어떤이 같은 테이블에서 행의 상관 관계를 것을 의미한다.
당신이 자체 테이블의 데이터를 평가해야 할 때 유용 자체 조인. 어떤이 같은 테이블에서 행의 상관 관계를 것을 의미한다.
구문 : 테이블 T1 FROM SELECT * TABLE WHERE t1.columnName T2 = t2.columnName
예를 들어, 우리는 초기 지정 현재 지정에 동일 직원의 이름을 찾고 싶어요. 우리는 자기 방식을 다음에 참여하여이 문제를 해결할 수 있습니다.
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
-
==============================
12.이 행이 다른 행에 약간의 용량에 대한 참조를 포함하는 연결리스트 / 트리의 데이터베이스에 해당합니다.
이 행이 다른 행에 약간의 용량에 대한 참조를 포함하는 연결리스트 / 트리의 데이터베이스에 해당합니다.
-
==============================
13.자기가 평신도의 관점에서 참여의 여기 exaplanation입니다. 셀프 조인의 다른 유형이 아닌 가입 할 수 있습니다. (내부, 외부, 그리고 크로스 조인) 조인의 다른 유형을 이해하면, 자기는 정직해야 가입 할 수 있습니다. INNER, OUTER 및 CROSS 조인에서는 2 개 이상의 서로 다른 테이블을 조인. 자체 조인 그러나 itslef과 같은 테이블을 가입 할 수 있습니다. 여기, 우리는 2 개 개의 다른 테이블을 가지고 있지만, 테이블 별칭을 사용하여 다른 테이블과 같은 테이블을 취급하지 않습니다. 이 여전히 명확하지 않으면, 나는 다음과 같은 유튜브 비디오를 시청할 권 해드립니다 것이다.
자기가 평신도의 관점에서 참여의 여기 exaplanation입니다. 셀프 조인의 다른 유형이 아닌 가입 할 수 있습니다. (내부, 외부, 그리고 크로스 조인) 조인의 다른 유형을 이해하면, 자기는 정직해야 가입 할 수 있습니다. INNER, OUTER 및 CROSS 조인에서는 2 개 이상의 서로 다른 테이블을 조인. 자체 조인 그러나 itslef과 같은 테이블을 가입 할 수 있습니다. 여기, 우리는 2 개 개의 다른 테이블을 가지고 있지만, 테이블 별칭을 사용하여 다른 테이블과 같은 테이블을 취급하지 않습니다. 이 여전히 명확하지 않으면, 나는 다음과 같은 유튜브 비디오를 시청할 권 해드립니다 것이다.
자기는 예와 함께 가입
from https://stackoverflow.com/questions/2458519/explanation-of-self-joins by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 마이크로 소프트 SQL 서버와 LIMIT를 구현하는 방법? (0) | 2020.03.19 |
---|---|
[SQL] MySQL의 트리거 업데이트 후 행이 변경된 경우에만 (0) | 2020.03.19 |
[SQL] 자바 / JPA에서 저장 프로 시저를 호출 (0) | 2020.03.19 |
[SQL] 데이터베이스 트리거 악이 있습니까? [닫은] (0) | 2020.03.19 |
[SQL] VARCHAR에서 int로 캐스트 - MySQL의 (0) | 2020.03.19 |