如何从一个表中选择尚未被用户选择的所有记录?

时间:2015-02-11 17:45:54

标签: mysql sql postgresql

我知道存在类似的问题How to select all records from one table that do not exist in another table?,但我有不同的情况

我有TotalTrainings,包含所有记录

TraningCode |  TraningName
1                   A
2                   B
3                   C
4                   D
5                   E 

和另一个表SelectedTraining

TraningCode |  TraningName | EmpCode | AppraisalID
1                   A           7190      12
2                   B           7190      12
3                   C           8132      10
4                   D           5555      08
5                   E           8132      10

现在我必须从TotalTrainings检索EmpCode = 7190appraisalId 12

选择的所有记录(培训)

注意TotalTraining的别名是tt,而SelectedTrainingst

我已经完成了这样的书面查询:

select tt.trainingCode from TotalTraining tt left join SelectedTraining st
on tt.trainingCode = st.trainingCode where st.trainingCode is null 
and EmpCode=7190 and appraisalId =12

但它没有给出任何结果。

我已经使用NOT IN达到了同样的效果

select tt.trainingCode from TotalTraining tt where tt.trainingCode not in 
(
select st.trainingCode from SelectedTraining st where 
EmpCode=7190 and appraisalId =12
)

我想用Joins来实现,任何人都可以告诉我可能出错的地方。

注意:请在此处忽略拼写错误,例如区分大小写AppraisalIdappraisalId,因为这不是问题

预期输出

3
4
5

因为EmpCode 7190

尚未选择这些培训

1 个答案:

答案 0 :(得分:2)

对于第一个查询,您需要将大部分条件推送到on子句 - 第二个表上的所有条件:

select tt.trainingCode
from TotalTraining tt left join
     SelectedTraining st
     on tt.trainingCode = st.trainingCode and
        st.EmpCode = 7190 and
        st.appraisalId = 12
where st.trainingCode is null ;