我有2个查询,它会给我一份未经过培训的员工名单,但我需要更新它,因为一旦员工再培训我们需要保留旧记录,所以创建了一个非活动字段用于记录,但我不能弄清楚如何获得我设置的2个查询以排除模块表中的搜索,所以我有这些表
EmployeeT - Primary Key EmployeeID
持有员工信息
ModulesT - Primary Key ModuleID
保留员工培训信息
(此表具有非活动列(Mod_Inactive数据类型)
SkillT - Primary Key SkillID
保存模块的技能信息
如果员工从未接受过技能组培训,那么这是我使用的2个查询
通知查询
SELECT EmployeeT.EENumber, SkillT.SkillID
FROM EmployeeT, SkillT GROUP
BY EmployeeT.EENumber, SkillT.SkillID;
NotTrained Query
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中有一个前端&后端数据库。
更新时间:07/08/16
此查询向我提供了从未接受过任何培训的员工列表
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
答案 0 :(得分:0)
您可以格式化新查询以将每个连接放在一行中,为表提供别名。
这是一个好习惯,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
注意:您无需分组 您可以加入相关表格以获取额外的列
<强> Sugession:强>
EmployeeT和ModuleesT之间的关系是1对多 因此,ModulesT的主键是复合键:EENumber,ModulesID
如果员工的数量超过ModuleeT,而且可以将ModulesT分配给员工以上,那么关系是多对多的,您需要第三个表来表示交集表
所以添加Table,例如ModuleCatalog
的moduleId SkillID 模块名
ModuleCatalog 1-&gt;很多有技巧的人 ModuleCatalog 1-&gt;许多与ModulesT
您需要修改模型中的关系以反映此新表。
编辑2:
问:如何从SkillT获取列表而不是在ModulesT
中答:使用左联接技能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