postgresql 一个特定字段没有重复值的SQL联合

nr7wwzry  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(338)

有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之间的关系是一对多,PROJECT和MANAGER之间的关系是一对一。
所有存储在数据库中的姓氏都是唯一的。经理可以同时是同一个项目的开发人员。(在这种情况下,他的数据存储在两个表中)。
我想从我的数据库中收到所有开发人员和经理对特定项目的列表,形式如下:

识别码|姓氏|是经理

我认为它适合下面的查询:

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

但是我不想有两行经理的数据,如果他也是特定项目的开发人员!我想留下property isManager为true的行。请建议我正确的查询来解决这个问题!

hmae6n7t

hmae6n7t1#

您可以使用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对数据库设计的建议。

at0kjp5o

at0kjp5o2#

你可以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

相关问题