从顶部开始,我们有一个简单的表,我们称之为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]?
答案 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,但我强烈建议你选择一个并明确您将要使用的加入类型。