【问题标题】:ms-access query for not trained未训练的 ms-access 查询
【发布时间】: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 中正在研究这个,有一个前端和后端数据库。

Relationship Image

更新: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 的表,再加上您使用级联连接。很难被审查。
  • 您可以格式化新查询,让每个连接都在一行中,为表提供别名。这是一个好习惯。

标签: ms-access ms-access-2010


【解决方案1】:

您可以格式化新查询,让每个连接都在一行中,为表提供别名。

这是一个好习惯,sql的格式代表了表之间的视觉关系。

SELECT e![FirstName] & " " & e![LastName] AS Employee, 
       s.Description
FROM AllTrainings  a
INNER JOIN EmployeeT e ON a.EENumber = e.EENumber
INNER JOIN SkillT s ON a.SkillID = s.SkillID
where 
   -- add your creteria to filter data
ORDER BY e.EENumber

编辑:

如果字段“ModulesT.Mod_Inactive”表示员工是否受过培训(0 未受过培训,1 受过培训) 所以未经培训的员工和相应的模块是:

 select EENumber ,ModulesID, SkillID
 from ModulesT 
 where
   Mod_Inactive = 0

注意:你不需要分组 您可以加入相关表以获得额外的列

建议:

  • EmployeeT 和 ModuleesT 之间的关系是一对多 所以,ModulesT 的主键是复合键:EENumber ,ModulesID

  • 如果员工有多个 ModuleeT 并且 ModulesT 可能分配给多个 Employee,所以关系是多对多的,你需要第三个表来表示交集表

    所以添加表格,例如,ModuleCatalog

    模块ID 技能ID 模块名称

    ModuleCatalog 1->许多具有技能T ModuleCatalog 1->许多与 ModulesT

您需要修改模型中的关系以反映这个新表。

编辑 2:

问:如何从 SkillT 中获取不在 ModulesT 中的列表

A:将左连接技能T与ModulesT一起使用:

SELECT s.Description, m.EEnumber
FROM skillT sLEFT
LEFT JOIN ModulesT m ON s.skillId = m.skilliD
WHERE m.skilliD Is Null

编辑 3:

表 ModulesT 可能包含同一员工的多个技能,也可能包含同一技能的多个员工,因此您可以在 EENumber 和 SkillId 上创建复合唯一索引。

创建唯一索引评论:create unique Index

【讨论】:

  • 我想要做的是获得一个未受过培训的员工列表,上面 2 个查询给了我,但如果他们在模块 T 中有记录并且不活动将其添加到我知道的 Alltrainings 查询中我没有很好地解释这一点,感谢您对我仍在学习的别名的建议,这对我来说是一个很大的学习曲线
  • 查询 AllTrainings 无效,因为它生成所谓的 Cartezian 积,因为不存在连接。只是你需要在 modultT 的雇员(雇员从未接受过技能培训),
  • 好的,已经看到你所说的了一份未受过培训的员工名单,到了一半还想弄清楚如何获得一份未受过培训的员工名单,如果我还需要另一个表格,我会将工作查询添加到我上面的问题到目前为止的帮助
  • 我更新了我的帖子以获取未接受过哪种技能培训的员工名单。您可以使用 EmployTT 加入此查询以获得 firstName +" " + lastname。
  • 一直在努力让上面的工作你给我的最后一个查询给了我技能列表,但没有 EENumber 我不知道如何修改上面的查询给我一个列表所有未接受过模块表中技能集培训的员工对技能T 为空,所以弹出 joe as never been training
【解决方案2】:
SELECT T.EENumber, T.FirstName, T.LastName, T.Description
FROM (SELECT EENumber, FirstName, LastName, SKillID, Description FROM EmployeeT, SkillT)  
AS T LEFT JOIN ModulesT AS M ON (T.SkillID = M.SkillID) AND (T.EENumber = M.EENumber)
WHERE M.SkillID Is Null OR M.Mod_Inactive=True
ORDER BY T.EENumber, T.Description;

已经设法让它工作,现在会生成一个未接受过技能集培训的员工列表,如果 mod.inactive 设置为 true 将显示该模块需要培训

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多