首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂的SQL表关系?

复杂的SQL表关系?
EN

Stack Overflow用户
提问于 2013-08-21 17:09:50
回答 3查看 1.9K关注 0票数 1

我对数据库表和它的查询有一个问题。让我告诉你这是怎么回事。这是关于项目经理与员工的关系。现在让我在陈述中说明他们之间的关系..。

Manager = manager是项目负责人,也可以是多个项目的经理。

Employee =(S)他是一个只从事由经理管理的项目或projectS的人。

项目= Project是一个仅由一个管理人员管理的项目。

员工-经理关系

经理也是公司的雇员,对吗?根据这一点,我希望他们的关系像->一样,一个员工可以由一个以上的经理来管理。

所有的经理都有相同的头衔,我的意思是没有经理。只有员工的经理。例如,5名员工可以由Manager管理。

员工-项目关系

员工可以有一个有意义的项目,员工也可以有一个以上的项目也是有意义的。所以项目也可以有一个以上的员工。(提醒:项目可以有多个员工,但不能由一个以上的经理管理)。

经理-项目关系

经理可以有多个项目。但是项目不能由一个以上的经理来管理。

PS:根据项目,不同项目中的同一个员工可以由多个经理管理--参见下面的示例.

Android应用程序项目经理-> Patrick

安卓应用程序项目的员工--> John,Susan,Megan,Joe.

另一个项目..。

IOS应用程序项目经理-> Ryan

IOS应用程序项目的员工-克莱尔、沃尔特、罗伯特、Megan

现在让我展示一下我的桌子。我真不知道该怎么做..。

在该表中,我尝试使用"manager_id(FK)“来表示"employee_id(PK)”,因为Manager是公司的员工。

我在Project表中有"manager_id(FK)“,在employee表中引用"manager_id”。

这就是我不太明白的proj_employee表。我在互联网上的例子中发现了这种情况。这样我们就可以在查询中调用它们。

现在让我发布我试过的问题但永远得不到解决方案..。

代码语言:javascript
复制
        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的选择项目。如果我的桌子错了,你能给我指路或者告诉我怎么做吗?

我有知识,但我想不出怎样才能使这件事成功。

EN

回答 3

Stack Overflow用户

发布于 2013-08-21 18:09:16

我想我终于看到了这个问题。

您说,“项目表中有"manager_id(FK)”,在employee表中引用"manager_id“。

我想这可能就是问题所在。我认为您希望employee_id表中的manager_idemployee表中的project列的外键,而不是manager_id列的外键。但你在你的查询中得到了正确的答案。

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

与您的问题无关,但我想借此机会指出,在每个表中都有一个名为id的主键列可以帮助我们使“错误”的SQL看起来像“错误的”SQL。“让错误的代码看起来不对”--乔尔·斯波斯基

如果我们期望:

主键的形式为:id

外键的形式:parent_table_id,或parent_role_id

连接的绝大部分将从外键到主键。

那么,我们期望大多数连接都是形式的。

代码语言:javascript
复制
child.parent_id = parent.id

而外键定义的形式是

代码语言:javascript
复制
FK_child_parent_or_role (parent_or_role_id) REFERENCES parent (id)

这就形成了这样的外键定义:

代码语言:javascript
复制
FK_project_manager (manager_id) REFERENCES employee (manager_id)

在我们看来是“错的”。我们希望看到对id列的引用。

票数 2
EN

Stack Overflow用户

发布于 2013-08-21 17:54:17

您可以使用以下内容获得一个列表(project_name、manager_name、employee_name):

代码语言:javascript
复制
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;

在两个项目中,你会得到这样的结果,其中一个项目没有员工:

代码语言:javascript
复制
 project_name  | employee_name | manager_name 
---------------+---------------+--------------
 Stack O       | Alice         | Eve
 Stack O       | Bob           | Eve
 Lemon Squeezy |               | Alice
票数 0
EN

Stack Overflow用户

发布于 2013-08-21 18:02:11

没有理由有外部连接,我可以看到。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18363656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档