SQL显示值基于联接表

时间:2016-07-14 12:55:51

标签: sql sql-server join

从顶部开始,我们有一个简单的表,我们称之为Employee_table

 [dbo.Employee_table]
 --------------------------
 Employee name | EmployeeID | BossID  
 Tom Something      11          23
 Mark Cole          54          32
 Samantha Cat       23          12

我创建了一个触发器,在更新时插入另一个表[dbo.Employee_tableHistory]旧的和新的boss ID。

[dbo.Employee_tableHistory]
---------------------------
  name      |        OldBossID  |    NewBossID
 Tom Something          23              12
 Mark Cole              32              32
 Samantha Cat           12              23

然后我有一个程序,其中我想要返回id的全名...所有员工姓名的来源是第一个表[dbo.Employee_table]

因此,对于最终的攻击,我想要这样的事情:

 [dbo.finalResault]
---------------------------
  name      |        OldBossName    |    NewBossName
 Tom Something      Boss Bosserson      Barabrian Conan                 
 Mark Cole          Chief Master        Leonidos                    
 Samantha Cat       Shepard Commander   Gray Gandalf

所有名称和ID都来自第一个表格。 这里的问题是,当我尝试按名称加入和显示数据时...它需要输入bossname的员工姓名。

如何从[dbo.Employee_tableHistory]转到[dbo.finalResault]?

3 个答案:

答案 0 :(得分:0)

这是怎么开始的?

SELECT
    e.EmployeeName,
    o.EmployeeName OldBossName
    b.EmployeeName NewBossName
FROM
    employee_table e
JOIN
    employee_table b ON e.BossId = b.EmployeeId
JOIN
    employee_tableHistory h ON e.EmployeeId = h.EmployeeId
JOIN
    employee_table o ON h.OldBossId = e.EmployeeId

Employee_Table_History也应该有一个EmployeeId。

答案 1 :(得分:0)

由于您在历史记录表中没有EmployeeId ...这应该适用于您的测试数据。一旦历史记录表得到更多填充,您就需要找到最后一个条目,理想情况下,该条目将使用canvas.getClipBounds() 或插入列的日期从ID列中删除。由于你没有列出这些,我在这里并没有把它们包括在内。

MAX()

答案 2 :(得分:0)

是的,正如Jonny建议的那样(并且scsimon没有这样做)但是没有深入到Employee_tableHistory应该有一个EmployeeId,实际上这甚至是问题的一部分,通过先修复表结构可以使问题更简单。在错误的基础上建造房屋是一个非常糟糕的主意,同样的事情适用于数据库开发,但有些人会继续努力解决问题,使其变得越来越大,直到它崩溃并且它们有一个很大的旧混乱 - 而不是在问题实际存在的地方尽早修复基础。这就是说让我们从头开始看你的问题,并为你提供一个更简单的解决方案。

 [dbo.tblEmployee]
 --------------------------
Employee_Id |  Employee_FirstName | Employee_LastName | BossType  
    11            Tom                  Something            0
    54            Mark                 Cole                 0
    23            Samantha             Cat                  0
    32            Chief                Masters              1
    12            Shepard              Commander            1
    17            Bill                 Bosserson            3
    21            Barbarian            Conan                2
    42            Larry                Leonidos             1
    25            Gary                 Gandalf              2

这个表的关键当然是Employee_Id,在显示和/或构建时我们首先放置,以便明显将名称分为第一个和最后一个是一个好主意,因为有时你会想要那样,并且很难连接分裂

现在我添加了BossType,以防你需要知道或验证某个特定员工是否真的是老板以及他们是什么级别的老板,因为老板可以拥有老板。还要记住,老板也是公司的员工,即使他们是私人公司的唯一所有者,因为概念公司是过度控制的控制人或所有公司的母公司

[dbo.tblEmployee_History]
---------------------------
  Employee_Id | Old_Boss_Id | New_Boss_Id
      11            17            21
      54            32            42
      23            12            25

注意,虽然标注不同,但Old_Boss_Id和New_Boss_Id只是最初从Employee表中提取的Employee_Ids,因此如果它们在Employee Table中不存在,它们在技术上是带有约束的外键,它们不能存在于此处

现在让View显示最终结果 - 我们执行以下操作

SELECT (e1.Employee_FirstName + “ “ + e1.Employee_LastName) AS Employee_Name
      ,(e2.Employee_FirstName + “ “ + e2.Employee_LastName) AS Old_Boss_Name
      ,(e3.Employee_FirstName + “ “ + e3.Employee_LastName) AS New_Boss_Name
  FROM dbo.tblEmployee_History bs
  JOIN dbo.tblEmployee e1
    ON em.Employee_Id = bs.Employee_Id
  JOIN dbo.tblEmployee e2
    ON em.Employee_Id = bs.Old_Boss_Id
  JOIN dbo.tblEmployee e3
    ON em.Employee_Id = bs.bs.New_Boss_Id;

这是一个更加可靠的解决方案,可以让你以后以简单的方式做更多的事情

注意我离开了Join类型,因为在大多数SQL语言中,Join被理解为Inner Join,我会留给你来确定你最终想要哪种类型的Join,但我强烈建议你选择一个并明确您将要使用的加入类型。