显示相同的字段与同一个表中的不同名称--Access 2010

时间:2013-11-17 19:59:38

标签: sql database ms-access-2010 erd

我有EmployeeName;它来自Employee表。 Employee表包含组织中的所有员工,Employee表引用Position表的主键,该表包含不同的位置名称。这就是我如何区分Employee表中的员工; Employee表中的每条记录都有PosNo引用位置表(worker = Pos1,manager = Pos2等等)。为简单起见,employee表中的记录类似致:EmployeeName, EmployeeAddress, DeptNo, PosNo

问题在于:某些职位处于其他职位之下。 Employee表中有工作人员,Employee表中有管理员。我想制作一张列出所有工人及其经理的表格。例如,该表将包含两个字段:EmployeeName, ManagerName

Employee表分为一般化层次结构。 SalaryHourly表从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

ERD

1 个答案:

答案 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

如果将它们放在一个看起来像这样的查询中

Query.png

它会产生如下结果:

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