3

DEVELOPERMANAGER、およびPROJECTの3 つのテーブルがあります。

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 と DEVELOPER の関係は 1 対多、PROJECT と MANAGER の関係は 1 対 1 です。

データベースに保存されているすべての姓は一意です。マネージャーは、同じプロジェクトで同時に開発者になることができます。(この場合、彼のデータは 2 つのテーブルに格納されています)。

特定のプロジェクトのすべての開発者とマネージャーのリストをデータベースから次の形式で取得したいと考えています。

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 

しかし、マネージャーが特定のプロジェクトの開発者でもある場合、マネージャーのデータを 2 行にしたくありません。プロパティ isManager が true である行を残したいと思います。この問題を解決するための適切なクエリを提案してください!

4

2 に答える 2

3

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 のアドバイスを検討してください。

于 2013-05-11T11:47:56.107 に答える
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
于 2013-05-11T11:17:50.483 に答える