2014-06-19 1 views
1

이 예제를 이해하는 데 어려움을 겪고 있습니다. 답변을 얻었지만 어떻게 작동하는지 머리를 감싸는 데 문제가 있습니다. 조인은 정확히 어떻게 작동합니까?SQL JOIN 및 LEFT OUTER JOIN

는 선수와 팀 테이블의 구조를 검사 :이 예를 들어

PLAYER 
    ------------- 
    PLAYER_ID NUMBER(9) PK 
    LAST_NAME VARCHAR2(25) 
    FIRST_NAME VARCHAR2(25) 
    TEAM_ID NUMBER 
    MANAGER_ID NUMBER(9) 

    TEAM 
    ---------- 
    TEAM_ID NUMBER PK 
    TEAM_NAME VARCHAR2(30) 

을, 팀 매니저는 선수, 그리고 MANAGER_ID 열은 PLAYER_ID 열을 참조합니다. 관리자 인 플레이어의 경우 MANAGER_IDNULL입니다.

성명은 플레이어의 이름, 팀 이름 및 플레이어의 관리자 이름을 포함하여 모든 플레이어의 목록을 제공 할 것입니다.

답변 :

SELECT p.last_name, p.first_name, m.last_name, m.first_name, t.team_name 
    FROM player p 
    LEFT OUTER JOIN player m ON (p.manager_id = m.player_id) 
    LEFT OUTER JOIN team t ON (p.team_id = t.team_id); 
+0

이것을 설명하는 가장 좋은 방법은 말 그대로 그림을 그리는 것입니다. 왼쪽에 하나, 오른쪽에 하나. 화살표는 어떤 방향으로 향하고 있습니까? 그것은 당신의 조인이 작동하는 방식입니다. "왼쪽에서 모든 레코드"또는 "오른쪽에서 모든 레코드"를 가져옵니다. – durbnpoisn

답변

2

은 그래서 첫 번째 LEFT OUTER JOIN는, 플레이어 테이블을한다 각 플레이어 관리자에 대한 정보를 추가합니다. 각 플레이어의 관리자는 ID이고, 플레이어는 ID입니다. A 씨 (player_id 9)가 Ted의 관리자이고 player_id 5 인 경우 Ted의 manager_id는 9이됩니다. 첫 번째 참여는 Ted의 manager_id, 9이며 그의 관리자 인 Mr. A의 player_id과 일치하므로 관리자의 정보도 테이블에 표시되며 m.last_namem.first_name에는 A의 이름이 표시됩니다. 두 번째 참여는 team_id이며 간단히 팀 테이블과 일치시키고 테이블의 플레이어 정보에 team_name을 추가합니다.

샘플 데이터 및 다이어그램 없이는 설명하기가 어렵습니다. 죄송합니다.

+1

나는 이것을 실제로 얻습니다. 몇 번 더 나아가고 이것이 어떻게 작동하는지 이해할 것입니다. 감사! – dood

0

더 쉽게 생각해 보려면 각각 joins을 개별적으로 살펴 보는 것이 좋습니다.

Join은 제공되는 쌍으로 두 테이블을 함께 조인 유형이며, 일치하는 항목이 있으면 오른쪽에서 데이터가 추출됩니다. 그러나 일치하는 것이 없으면 오른쪽에서 반환 된 데이터는 간단히 Null입니다. 이것은 일치가 발견되지 않으면 레코드가 단순히 생략되는 Inner Join과 다릅니다. 이를 위해

는 플레이어 또는 관리자가있을 수도 있고 없을 수도 있습니다, 그래서 플레이어가 매니저를 가지고, 또는 플레이어가하지 않는 경우, 그것은 Null을 반환하는 경우 관리자의 Player 기록을 다시 끌어 중 하나 Left Outer Join을 사용하고. 이 플레이어가 팀에있는 경우 Team 정보를 철수 할 Team 테이블에 보내고 Left Outer Join 그래서

마찬가지로, 플레이어는 또는 그렇지 않으면 Null 될 것입니다, 팀에있을 수도 있고 그렇지 않을 수도 있습니다.

Select 문은 단순히 세 개의 테이블에서 표시 할 필드를 선택합니다.

Join의 서로 다른 유형의 좋은 예

여기에서 볼 수있다 : 당신의 예에서 Difference Between Inner and Outer Joins

3

또한 관리자 인 선수의 MANAGER_ID 열에서 null 값을 가지고있다.인 SQL 문의 첫 번째 부분 보자

SELECT p.last_name, p.first_name, m.last_name, m.first_name, t.team_name 
FROM player p 
LEFT OUTER JOIN player m ON (p.manager_id = m.player_id) 

당신이 왼쪽을 수행하고 있기 때문에, 당신의 관리자 레코드가 비록 (필터링되지 않습니다 (대신 INNER이 조인의) 가입을 자신의 NULL 값 manager_id 열은 플레이어 테이블의 모든 player_id에 성공적으로 조인되지 않습니다.), m.last_name 및 m.first_name은 해당 관리자 플레이어에 대해 NULL입니다.

대신이 쿼리를 INNER JOIN으로 변경하면 manager_id에 NULL 값이 있고 player_id가있는 플레이어 레코드가 없기 때문에 관리자이기도 한 플레이어가 쿼리에서 전혀 반환되지 않습니다. NULL의.

SELECT p.last_name, p.first_name, m.last_name, m.first_name, t.team_name 
FROM player p 
INNER JOIN player m ON (p.manager_id = m.player_id) 

이 정보가 도움이되기를 바랍니다.

+0

아하이 봐요. 내부 조인은 관리자가없는 모든 플레이어를 반환합니다. LEFT OUTER는 모든 플레이어와 관리자를 반환합니다. – dood

+1

알았어! 처음에는 시각화하기가 어렵습니다. 저는 그 개념을 가장 오랜 시간 동안 정말로 고심했습니다. – MDiesel