mysql - 如何从一张表中选择用户尚未选择的所有记录?

标签 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 检索所有未由具有 appraisalId 12EmpCode = 7190 选择的记录(培训)

注意 TotalTraining 的别名是 ttSelectedTrainingst

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

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选择

最佳答案

对于第一个查询,您需要将大部分条件推送到 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 ;

关于mysql - 如何从一张表中选择用户尚未选择的所有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28460932/

相关文章:

php - DELETE * FROM TABLE WHERE this=that 不起作用

php - 从mysql中的2列中提取同时数据

mysql 查询不返回任何行

sql - 从 Oracle 查询中提取表引用

sql - 带有 LIKE 语句的 PostgreSQL hstore 列

java - 通过连接池线程安全的多线程数据库事务吗?

mysql - Postgresql/Python,将更新和插入查询合并为一个查询,仅当记录不存在时才插入

python - 使 sqlalchemy 在提交时不删除(或截断)临时表

mysql - mysql中的内连接

database - 在 Postgres 中定义主键的方式有什么不同吗?