【发布时间】:2016-08-03 00:33:44
【问题描述】:
我有 2 个查询会给我一个未受过培训的员工列表,但我需要更新它,因为一旦员工接受再培训,我们需要保留旧记录,因此为记录创建了一个非活动字段,但我不能弄清楚如何获取我设置的 2 个查询以排除模块表中的搜索,所以我有这些表
EmployeeT - Primary Key EmployeeID 保存员工信息ModulesT - Primary Key ModuleID 保存员工培训信息
(此表有非活动列(Mod_Inactive 数据类型)SkillT - Primary Key SkillID 保存模块的技能信息
如果员工从未接受过技能培训,这是我使用的 2 个查询
AllTraining 查询
SELECT EmployeeT.EENumber, SkillT.SkillID
FROM EmployeeT, SkillT GROUP
BY EmployeeT.EENumber, SkillT.SkillID;
未训练的查询
SELECT EmployeeT.EENumber, [EmployeeT]![FirstName] & " " & [EmployeeT]![LastName] AS Employee, ContractT.Contract, ShiftT.Shift, SkillT.Description, ShiftT.ShiftID, ContractT.ContractID, SkillT.SkillID, EmployeeT.Inactive
FROM ShiftT INNER JOIN (ContractT INNER JOIN (((AllTrainings INNER JOIN EmployeeT ON AllTrainings.EENumber = EmployeeT.EENumber) INNER JOIN SkillT ON AllTrainings.SkillID = SkillT.SkillID) LEFT JOIN ModulesT ON (AllTrainings.SkillID = ModulesT.SkillID) AND (AllTrainings.EENumber = ModulesT.EENumber)) ON ContractT.ContractID = EmployeeT.ContractID) ON ShiftT.ShiftID = EmployeeT.ShiftID
WHERE (((EmployeeT.Inactive)=False) AND ((ModulesT.TestDate) Is Null))
ORDER BY EmployeeT.EENumber;
上面的简化查询(我现在可以看到我没有从 modulesT 表中要求任何东西)
SELECT [EmployeeT]![FirstName] & " " & [EmployeeT]![LastName] AS Employee, SkillT.Description
FROM (AllTrainings INNER JOIN EmployeeT ON AllTrainings.EENumber = EmployeeT.EENumber) INNER JOIN SkillT ON AllTrainings.SkillID = SkillT.SkillID
ORDER BY EmployeeT.EENumber;
我知道我可能正在处理这个错误,并且认为我需要使用某种形式的子查询我已经对子查询的工作原理进行了大量研究,但似乎无法解决任何问题,非常感谢几周以来我一直在努力解决这个问题
所以简而言之,如果员工模块处于非活动状态,我需要所有培训查询不要查看它。
希望我能理解语法不是我的强项。
我在 ms-access 2010 中正在研究这个,有一个前端和后端数据库。
更新:2016 年 7 月 8 日
这个查询给了我一份从未接受过任何培训的员工名单
SELECT A.EENumber, A.FirstName, A.LastName
FROM EmployeeT AS A
WHERE NOT EXISTS (
SELECT *
FROM ModulesT AS B
WHERE A.EENUmber = B.EENumber
);
不知道如何从SkillT 而不是ModulesT 中获取列表
我正在寻找的最终结果是这样的
Name Description
Joe Bloggs Some Skill
Joe Bloggs Some Other SKill
Phil Blank Some Other Skill
Phil Blank Some SKill
【问题讨论】:
-
描述这些表之间的关系。 Do ModulesT 为所有员工填写 Mod_Inactive =false,然后您跟踪这些信息。第二个查询中的 ShiftT ,ContractT 是什么。
-
我在第一篇文章中放了一张关系窗口的图片。因为我认为可能更容易看出我的查询做错了什么,但是 ShiftT 和 ContractT 是针对 EmployeeT 的, SkillT 保存了所有关于模块在多久之前过期的信息,在 Employee 时保存的 ModuleT受过训练的人训练他们等
-
简化第二个查询,您似乎得到了工具自动生成的内容。您不需要在查询中包含所有表,因为关系由另一个表中的外键表示,再加上您使用不在模型中的名为 AllTrainings 的表,再加上您使用级联连接。很难被审查。
-
您可以格式化新查询,让每个连接都在一行中,为表提供别名。这是一个好习惯。