我正在尝试创建一个包含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_id
和role
以及user_id
的所有组合的视图,无论是否有某个角色的用户分配给该项目。
例如,如果project
表中只有2个项目,并且只有1个用户被分配给项目1而没有用户被分配给项目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;
然而,它没有给我理想的观点。 :(
答案 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');