我意识到这可能没有意义,所以让我试着解释一下:
我有两个包含以下列的表(只是相关的列):
positTraining (positID, trainID)
empTraining (empID, trainID)
positTraining
表包含position ids
列表以及该职位所需的任何training ids
。
empTraining
表包含employee ids
的列表以及员工已完成的任何当前training ids
。
我只想选择员工尚未完成的职位所需的training ids
。
因此,如果员工A已完成培训1& 3但是职位X需要培训1& 2,我想为缺失的训练选择trainID
(2)。
我希望这是有道理的。
我搜索了谷歌百万种不同的方式,并在这里检查了SO,但由于这个额外的要求,找不到合适的答案:
我只想根据trainIDs
选择empID
。这背后的推理是由于empID=2
可能具有正确的匹配但emp=1
可能没有。
我整个下午最接近的是使用以下内容:
select positID, trainID
from positTraining
except
select empID, trainID
from empTraining
返回:
positID | trainID
1 | 2
这是正确的,但仅限于当前的记录。只要另一名员工使用正确的匹配进入数据库,就会停止工作。
我尝试过使用几种不同的方法:
JOINS
不在
不存在
我确信这比制作它更容易,但我无法理解。
感谢您的帮助,我很乐意添加任何额外的细节,请告诉我。
编辑1
我正在使用SQL Server 2012 Express
编辑2
这就是我最终的结果,我认为这样做会有效:
SELECT
pt.trainID AS positTrainID,
et.trainID AS empTrainID,
e.empFirst + ' ' + e.empLast AS empName
FROM
positTraining pt,
empTraining et,
emps e
WHERE
pt.positID = 1 AND
e.empID = 1 AND
pt.trainID not in (
SELECT et.trainID FROM empTraining et WHERE et.empID = 1)
AND pt.trainID = et.trainID
结果:
positTrainID empTrainID empName
2 2 Emp1
感谢您的帮助!
答案 0 :(得分:3)
我认为这样可行:
SELECT
positID, trainID
FROM
positTraining
WHERE
positID = X
AND trainID not in (
SELECT trainID FROM empTraining WHERE empID = A)
将X视为您正在寻找员工A的positionId