我有EmployeeName
;它来自Employee
表。 Employee
表包含组织中的所有员工,Employee
表引用Position
表的主键,该表包含不同的位置名称。这就是我如何区分Employee
表中的员工; Employee
表中的每条记录都有PosNo
引用位置表(worker = Pos1,manager = Pos2等等)。为简单起见,employee表中的记录类似致:EmployeeName, EmployeeAddress, DeptNo, PosNo
问题在于:某些职位处于其他职位之下。 Employee
表中有工作人员,Employee
表中有管理员。我想制作一张列出所有工人及其经理的表格。例如,该表将包含两个字段:EmployeeName, ManagerName
。
Employee
表分为一般化层次结构。 Salary
和Hourly
表从Employee
表分支出来。然后,从Salary
表中,另一个表分支出Manager
(我称之为ProgramSupervisor
;它有一个唯一的字段)。然而,工人是Hourly
表的一部分。经理(ProgramSupervisor
)和工人(Hourly
)通过ISL
表相互关联。经理是ISL的负责人,因此ISL有一个ManagerNo
作为其领域之一。但是,工作人员(Hourly
)在ISL
中工作,因此ISLNo
作为其表中的字段Hourly
表。
所以,我试图找到一种方法来将所有这些表联系起来,形成一个包含两个字段,工人和经理的表,其中工人通过ISL
表属于管理者。我会使用某种嵌套查询吗?到目前为止我会发布我的代码,这绝对不正确(甚至可能没有在正确的轨道上),我会发布我的ERD,这样你就可以更好地了解表格的相关性。
SELECT EmpLastName + ', ' + EmpFirstName as ProgSupName,
EmpLastName + ', ' + EmpFirstName as EmpName
FROM Employee, Salary, ProgramSupervisor, ISL, Hourly
WHERE Employee.EmpNo = Salary.EmpNo
AND Salary.EmpNo = ProgramSupervisor.EmpNo
AND ProgramSupervisor.EmpNo = ISL.ProgramSupervisor_EmpNo
AND ISL.ISLNo = Hourly.ISLNo
AND Hourly.EmpNo = Employee.EmpNo
答案 0 :(得分:0)
在最简单的形式中,您可以将Employee-Supervisor关系提炼为三个表:
[雇员]
EmpNo EmpFirstName EmpLastName
----- ------------ -----------
1 Montgomery Burns
2 Homer Simpson
[每小时]
EmpNo ISLNo
----- -----
2 1
[ISL]
ISLNo ProgramSupervisor_EmpNo ISLName
----- ----------------------- -------------------------
1 1 Springfield Nuclear Plant
如果将它们放在一个看起来像这样的查询中
它会产生如下结果:
Employee_LastName Employee_FirstName ISLName Supervisor_LastName Supervisor_FirstName
----------------- ------------------ ------------------------- ------------------- --------------------
Simpson Homer Springfield Nuclear Plant Burns Montgomery
“但等一下!”我听到你说,“该查询中有四个表。[Supervisor]表来自哪里?”
这只是[Employee]表的另一个实例,它使用[Supervisor]作为别名。一个表可以多次出现在查询中,前提是我们在讨论[EmpLastName],[EmpFirstName]等时使用别名来指定我们所引用的实例。
上述查询的SQL显示倒数第二行的第二个实例Employee AS Supervisor
:
SELECT
Employee.EmpLastName AS Employee_LastName,
Employee.EmpFirstName AS Employee_FirstName,
ISL.ISLName,
Supervisor.EmpLastName AS Supervisor_LastName,
Supervisor.EmpFirstName AS Supervisor_FirstName
FROM
(
Employee
INNER JOIN
(
Hourly
INNER JOIN
ISL
ON Hourly.ISLNo = ISL.ISLNo
)
ON Employee.EmpNo = Hourly.EmpNo
)
INNER JOIN
Employee AS Supervisor
ON ISL.ProgramSupervisor_EmpNo = Supervisor.EmpNo