使用某些列的重复组合创建视图

时间:2014-07-15 20:41:47

标签: sql postgresql view

我正在尝试创建一个包含4个表中所有数据组合的视图 这是我的表的简化布局:

users: 
user_id - a unique id 
name - name of the user 
role - the unique role of the user, which is one of the following

project: 
project_id - a unique id 
project_name - name of the project 

roles:
role - Unique role name.  Currently: (employee, manager, admin)

project_users: 
project_id - the project id from project table 
user_id - the user id from user table 
role - the role of the user associated with user_id

我基本上想要创建一个包含project_idrole以及user_id的所有组合的视图,无论是否有某个角色的用户分配给该项目。

例如,如果project表中只有2个项目,并且只有1个用户被分配给项目1而没有用户被分配给项目2,那么视图应该显示如下:

  1. 查看 - project_roles
    • 第1行:project_id = 1,role = employee,user_id = 1
    • 第2行:project_id = 1,role = manager,user_id = null
    • 第3行:项目ID = 1,角色= admin,user_id = null
    • 第4行:project_id = 2,role = employee,user_id = null
    • 第5行:project_id = 2,role = manager,user_id = null
    • 第6行:project_id = 2,role = admin,user_id = null
  2. 基本上我将使用此视图返回没有为其分配特定角色的用户的项目 例如,如果我想获得一个没有分配经理的项目列表,我可以:

    SELECT project_id FROM project_roles WHERE user_id IS NULL AND role='manager';
    

    我似乎无法找到可以执行此操作的连接查询。到目前为止,我有以下内容:

    CREATE VIEW project_roles AS
        SELECT
            pu.project_id,
            pu.user_id,
            r.role
        FROM
            project_users pu
            FULL OUTER JOIN role r ON pu.role = r.role;
    

    然而,它没有给我理想的观点。 :(

2 个答案:

答案 0 :(得分:0)

我认为你想要cross join left outer join

create view project_roles as
    select p.project_id, r.role, count(pu.user_id)
    from projects p cross join
         roles r left outer join
         project_users pu
         on pu.project_id = p.project_id and pu.role_id = r.role_id
    group by p.project_id, r.role;

需要聚合才能获得计数。请注意,如果没有为特定项目/角色组合分配用户,则会返回0。如果您真的想要,可以将其转换为NULL

编辑:

我认为此修改将适用于公司问题:

create view  project_roles as
    select p.project_id, r.role, count(pu.user_id)
    from projects p join
         roles r
         on p.company_id = r.company_id left outer join
         project_users pu
         on pu.project_id = p.project_id and pu.role_id = r.role_id
    group by p.project_id, r.role, r.company_id;

我不确定您在加入company_id时是否需要project_users

答案 1 :(得分:0)

  

基本上我将使用此视图返回没有的项目   分配给它的特定角色的用户。例如,如果我想   得到一个没有分配经理的项目清单,我可以:

SELECT project_id FROM project_roles WHERE user_id IS NULL AND role='manager';

您不需要(不必要的慢)视图。只需使用NOT EXISTS反半连接的查询:

SELECT * FROM project
WHERE  NOT EXISTS (SELECT 1 FROM project_user WHERE role = 'manager');