2016-09-22 2 views
0

테이블에서 팀 리더와 팀원의 전체 목록을 얻는 방법을 배우려고합니다. 팀이없는 팀 리더 인을 포함합니다.MySQL - 빈 관계 찾기

기본 인물이 들어있는 표 person이있는 기본 데이터 구조가 있습니다. 특정 사용자의 경우 details 표에서이 표를 확장합니다.

우리가 가지고있는 확장 된 정보 중 하나는 team_leader 상태입니다. 이를 정의하는 관련 세부 사항이 두 개 있습니다 (detail_isTeamLeaderdetail_teamLeader). 첫 번째는 부울이며 팀 리더의 짧은 목록을 정의합니다. 두 번째 부분은 사람 팀 리더가 누구인지 정의합니다 (이상적으로는 하위 집합의 사람).

_person table_ 
person_id 
person_name 

_detail table_ 
detail_id 
detail_person_id 
detail_isTeamLeader 
detail_teamLeader 

나는 다음과 같은 쿼리를 사용하여 팀을 보유하고있는 모든 팀 리더를 얻을 수 있습니다 :

SELECT tl.person_id AS tlref, tl.person_name AS tlname, 
per.person_id AS perref, per.person_name AS pername 
FROM detail 
LEFT OUTER JOIN person AS per ON detail.person = per.person_id 
LEFT OUTER JOIN person AS tl ON detail_teamleader = tl.person_id 
ORDER BY tlname, psname 

그러나,이 detail.isTeamLeader 사실이지만 detail_teamLeader 분야에서 발생하지 않는 team_leaders 실패합니다.

샘플 데이터 조 프레드 위의 예에서

person_id person_name 
1   Joe Bloggs 
2   Fred Smith 
3   Frank Jones 
4   Amy Kelly 

detail_id detail_person_id detail_isTeamLeader detail_teamLeader 
1   1     1      0 
2   2     1      0 
3   3     0      3 
4   4     0      3 

팀 리더입니다. 그러나 조는 팀원 중 아무도 가지고 있지 않으므로 위 쿼리에서 결과 집합은 생략됩니다.

데이터 구조를 정규화하는 것이 가장 좋은 방법 일 수 있다고 생각하지만이를 수행하지 않는 방법이 있습니까? 당신은 테이블 '세부'나는 당신이 코드를 사용할 수 있습니다 생각에 기록을 대응하는 모든 팀 리더 및 테이블 '사람'의 모든 기록이 필요한 경우

+0

샘플 데이터와 원하는 결과는 현재 가지고있는 문제를 전달하는 데 도움이됩니다. –

+1

사람 테이블을 확장하는 경우 a) 세부 테이블에 person_id가 기본 키로 있어야하며 b) 항상 사람 테이블에서 시작하여 거기에서 왼쪽으로 조인 (또는 오른쪽 조인 사용)해야합니다. – Solarflare

+0

데이터 예제를 추가하고'detail_person'이'person_id'의 열쇠임을 분명히했습니다. –

답변

1

난 당신이 1을 이해 1 인물과 세부 사람 사이의 관계이지만 모든 사람이 세부 정보를 가지고있는 것은 아닙니다.

팀에있는 모든 사람 (팀이없는 사람 포함) 만 얻거나 팀 리더 정보가있는 모든 사람과 함께있는 데이터 세트를 원한다면 잘 모르겠습니다. .

첫 번째 경우 내부 팀원 (또는 SQL 서버에서 CTE)을 사용하여 팀 리더를 모두 선택하고 세부 정보 및 사람 테이블에 참여시켜야합니다.

select tl.person_id as tlref, tl.name as tlname, p.person_id as perref, p.name as pername 
from (
     select p.person_id,p.name 
     from @persons p 
     inner join @details d on d.person_id = p.person_id and d.is_temamleader = 1 
) tl 
left outer join @details d on d.team_leader = tl.person_id 
left join @persons p on p.person_id = d.person_id 

두 번째 경우의 경우 (자신의 팀 리더 정보를 모든 사람 점점) :

select p.person_id as perref, p.name as pername, d.is_teamleader, pTl.person_id as tlref, ptl.name as tlname 
from @persons p 
left outer join @details d on d.person_id = p.person_id 
left outer join @persons pTl on pTl.person_id = d.team_leader 

내가 첫 번째 쿼리 의심을 당신이 요구되었다하지만 추가 무엇입니까 다음은 사용할 수있는 쿼리입니다 두 번째는 필요할 때를 대비 한 것입니다. 테이블 변수 (@persons, @details)를 사용 했으므로 실제 테이블 이름으로 바꾸십시오.

+0

첫 번째가 실제로 필요한 것입니다. 도와 주셔서 감사합니다! –

0

:

SELECT 
    person_id, person_name 
FROM 
    person 
LEFT JOIN 
    detail 
ON 
    person.person_id = detail.person 
WHERE 
    detail.detail_isTeamLeader = 1