查询存在且不存在

时间:2017-05-03 17:52:05

标签: sql sql-server performance

我正在寻找有学生的学生 缺席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'
            )

2 个答案:

答案 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'