2013-05-11 3 views
1
이 3 표를 개발자, MANAGERPROJECT있어

: 프로젝트와 개발자 사이의 relantionship은 한 - 많은SQL 연합

create table DEVELOPER(id int(4), lastname varchar(40), project_id int(4)); 

create table MANAGER(id int(4), lastname varchar(40), project_id int(4)); 

create table PROJECT(id int(4), name varchar(40)); 

이며, PROJECT와 MANAGER 사이의 관계는 일대일입니다.

데이터베이스에 저장된 모든 성은 고유합니다. 관리자는 동일한 프로젝트의 개발자가 될 수 있습니다. (이 경우 두 개의 테이블에 저장된 그의 데이터). |

ID :

나는 다음과 같은 형식으로 내 데이터베이스에서 특정 프로젝트의 모든 개발자의 목록과 관리자를 수신 할 |

SELECT id, lastname, false AS isManager FROM developer WHERE project_id = 314 
UNION 
SELECT id, lastname true AS isManager FROM manager WHERE project_id = 314 

그러나 그는 또한 특정 프로젝트의 개발자 인 경우 나 관리자의 두 개의 데이터 행을 갖고 싶어하지 않습니다 책임자에게 isManager

는 나는 다음과 같은 쿼리를 맞는 것 같아! 나는 property isManager가 참인 선을 떠나고 싶다. 이 문제를 해결하려면 적절한 쿼리를 제안하십시오!

+0

이 두 테이블 사이의 관계 –

+4

'developer'와'manager'는 두 개의 서로 다른 테이블이 아니어야합니다. 'person (id, firstname, lastname)'과 'project_member (person_id, project_id, project_role)'와 같은 프로젝트에서 사람의 역할을 나타내는 하나의 테이블'person'과 그 사람의 역할을 나타내는 링크 테이블을 가져야합니다. –

+1

@a_horse_with_no_name, I 너와 절대적으로 동의한다. 그러나 제 상황에서는이 db 구조로 작업해야합니다. – Alex

답변

2

:

SELECT COALESCE(m.id, d.id) AS id -- m comes first! 
    , lastname     -- lastname consolidated by USING 
    , CASE WHEN m.id IS NOT NULL THEN TRUE ELSE FALSE END AS is_manager 
FROM developer d 
FULL OUTER JOIN manager m USING (lastname, project_id) 
WHERE project_id = 314; 

하지만 먼저 당신이 당신의 DB 설계에 대한 @a_horse_with_no_name's advice을 고려할 수 있습니다.

+0

화려한 답변! 감사 – Alex

0

당신은 group by 제거 할 수 있습니다 중복 : 당신은 그 목적을 위해 FULL OUTER JOIN을 활용할 수

select id 
,  lastname 
,  max(IsManager) as IsManager 
from (
     select id 
     ,  lastname 
     ,  project_id 
     ,  0 as IsManager 
     from developer 
     union all 
     select id 
     ,  lastname 
     ,  project_id 
     ,  1 
     from manager 
     ) SubQueryAlias 
where project_id = 314 
group by 
     id 
,  lastname