[英]Complex SQL Table Relationships?
我对数据库表及其查询有疑问。 让我说说这是什么。 这是关于项目-经理-雇员的关系。 现在让我在陈述中告诉他们他们之间的关系...
经理 =经理是项目负责人,或者可以是多个项目的经理。
雇员 =(s)他是仅在由经理管理的项目或projectS上工作的人。
项目 =项目是仅由ONE Manager管理的项目。
员工-经理关系
经理也是公司的雇员吗? 据此,我希望他们的关系->一名雇员可以由多个经理管理。
所有经理都具有相同的头衔,我的意思是没有经理。 员工只有经理。 例如,一个经理可以管理5名员工。
员工-项目关系
员工可以拥有一个有意义的项目,员工也可以拥有一个以上有意义的项目。 因此,项目也可以拥有一个以上的员工。 (提醒:项目可以有一位以上的员工,但不能由一位以上的经理来管理)。
经理-项目关系
经理可以拥有多个项目。 不能由多个管理器来管理项目。
PS:根据项目,不同项目中的同一名员工可以由多个经理来管理。请参见下面的示例...
Android App PROJECT的经理 ----> Patrick
Android App PROJECT的员工 -----> John,Susan, Megan和Joe。
另一个项目...
IOS App PROJECT的经理 ----> Ryan
IOS App PROJECT的员工 ---->克莱尔,沃尔特,罗伯特, 梅根
现在让我显示我的桌子...我真的不知道该怎么办...
在该表中,我尝试将“ manager_id(FK)”引用为“ employee_id(PK)”,因为Manager是公司的雇员。
我在项目表中有“ manager_id(FK)”来引用员工表中的“ manager_id”。
那是我不清楚的proj_employee表。 我在互联网的示例中找到了这种方式。 这样,我们在查询中称呼它们。
现在,让我发布我尝试过但无法解决的问题...
select
e.name as employee_name,
pm.name as manager_name
from Proj_Employee as pe
left outer join Employee as e on e.employee_id = pe.emp_id
left outer join Project as p on p.project_id = pe.project_id
left outer join Employee as pm on pm.employee_id = p.manager_id
where pe.project_id = <project id>
我想问一下...我想要一个查询,该查询向我显示EmployeeName,ManagerName OF所选项目。 如果我的桌子不对,您能指导我或告诉我该怎么做吗?
我有知识,但无法弄清楚如何进行这项工作。
我想我终于明白了这个问题。
您说:“并且我在Project表中有“ manager_id(FK)”来引用employee表中的“ manager_id”。
我认为可能是问题所在。 我想你想manager_id
在project
表是一个外键employee_id
列的employee
表,而不是manager_id
列。 但是,您已经在查询中找到了正确的位置。
SQL Fiddle演示在这里:http://www.sqlfiddle.com/#!2/e31fb/1
与您的问题并没有真正的关系,但我只是想借此机会指出,在这种情况下,每个表中的名为id
的主键列都会使我们使“错误的” SQL看起来像“错误的” SQL。 “使代码看起来不正确”-Joel Spolsky
如果我们期望:
主键的形式为: id
外键将采用以下形式: parent_table_id
或parent_role_id
绝大多数联接将从外键到主键
那么我们期望大多数联接将采用以下形式
child.parent_id = parent.id
并且外键定义将采用以下形式
FK_child_parent_or_role (parent_or_role_id) REFERENCES parent (id)
这使得外键定义如下:
FK_project_manager (manager_id) REFERENCES employee (manager_id)
向我们看“错”。 我们希望看到对id
列的引用。
您可以使用以下内容获取(project_name,manager_name,employee_name)的列表:
SELECT p.project_name
, e.name as employee_name
, m.name as manager_name
FROM project p
INNER JOIN employee m ON p.manager_id = m.employee_id
LEFT JOIN proj_employee pe ON p.project_id = pe.project_id
LEFT JOIN employees e ON pe.emp_id = e.employee_id;
对于两个项目,您将获得类似的内容,其中一个没有员工:
project_name | employee_name | manager_name
---------------+---------------+--------------
Stack O | Alice | Eve
Stack O | Bob | Eve
Lemon Squeezy | | Alice
我没有理由拥有外部联接。
select p.Project_Name, m.name as Manager, e.name as Employee
from Project P
join Employee M on m.employee_id = p.manager_id
join project_employee pe on pe.project_id = p.project_id
join Employee E on e.employee_id = pe.employee_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.