2013-05-11 57 views
1

是有3個表DEVELOPERMANAGER項目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)); 

項目和開發人員之間的relantionship是一到多, PROJECT和MANAGER之間的關係是一對一。

存儲在數據庫中的所有姓氏都是唯一的。經理可以同時擔任同一項目的開發人員。 (在這種情況下他的數據存儲在兩個表中)。

我想在下面的表格從我的數據庫收到的所有開發項目的具體名單和經理:

ID | 姓氏 | IsManager的

我認爲這將滿足以下查詢:

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爲真的行。請建議我正確的查詢來解決這個問題!

+0

這兩個表之間的任何關係 – 2013-05-11 11:14:52

+4

'developer'和'manager'不應該是兩個不同的表。你應該有一個表'person'和一個鏈接表,說明這個人在一個項目中的角色,比如'person(id,firstname,lastname)'和'project_member(person_id,project_id,project_role)' – 2013-05-11 11:21:51

+1

@a_horse_with_no_name,I絕對同意你的看法。但在我的情況下,我必須使用這個數據庫結構。 – Alex 2013-05-11 12:07:37

回答

2

您可以利用FULL OUTER JOIN用於這一目的:

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; 

但首先你可能會考慮@a_horse_with_no_name's advice關於你的數據庫設計。

+0

明智的答案!謝謝 – Alex 2013-05-11 13:16:44

0

可以group by消除重複:

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