繁体   English   中英

复杂的SQL表关系?

[英]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_idproject表是一个外键employee_id列的employee表,而不是manager_id列。 但是,您已经在查询中找到了正确的位置。


SQL Fiddle演示在这里:http://www.sqlfiddle.com/#!2/e31fb/1


与您的问题并没有真正的关系,但我只是想借此机会指出,在这种情况下,每个表中的名为id的主键列都会使我们使“错误的” SQL看起来像“错误的” SQL。 “使代码看起来不正确”-Joel Spolsky

如果我们期望:

主键的形式为: id

外键将采用以下形式: parent_table_idparent_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM