SELECT一个表中的值与另一个表不匹配,但也引用另一个列?

时间:2013-04-30 20:35:11

标签: sql sql-server-2012

我意识到这可能没有意义,所以让我试着解释一下:

我有两个包含以下列的表(只是相关的列):

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我认为这样可行:

SELECT 
   positID, trainID 
FROM 
   positTraining 
WHERE 
   positID = X 
   AND trainID not in (
      SELECT trainID FROM empTraining WHERE empID = A)

将X视为您正在寻找员工A的positionId