我正在寻找有学生的学生
缺席reason_code = 'DOG_ATE_HOME_WORK'
并且过去没有理由'I_WAS_DRUNK'
鉴于db中有成千上万的学生和数百万个理由,这是最有效的mssql方式吗?
select student_id from students where
exists(
SELECT 1 FROM absence_reasons absence_r
where absence_r.student_id = students.student_id and
absence_r.reason_code = 'DOG_ATE_HOME_WORK'
)
and not
exists(
SELECT 1 FROM absence_reasons absence_r
where absence_r.student_id = students.student_id
and absence_r.reason_code = 'I_WAS_DRUNK'
)
答案 0 :(得分:2)
使用EXISTS和NOT EXISTS通常是执行此类操作的最有效方法之一。你只需要确保你有一个student_id索引。如果您想要更多改进,可以将reason_code添加到该索引。
唯一的问题是你写的不正确。
您的NOT EXISTS查询需要
and absence_r.reason_code = 'I_WAS_DRUNK'
代替
and absence_r.reason_code <> 'I_WAS_DRUNK'
答案 1 :(得分:1)
抱歉,如果它不起作用。但这个理想情况下测试其他查询。 同时测试查询执行计划和已用时间。还要从缓冲区中清除缓存。还要使用参数变量。耗尽测试。
select student_id from
(
select student_id,reason_code from students where
not exists(
SELECT student_id1 FROM absence_reasons absence_r
where absence_r.student_id = students.student_id
and absence_r.reason_code = 'I_WAS_DRUNK'
)
)t4
where reason_code = 'DOG_ATE_HOME_WORK'