请教这样的语句该怎么优化,本地执行就需要10秒,总共约100万数据

请问这样的语句该如何优化,本地执行就需要10秒,总共约100万数据
这里我举例说明我的需求,实际情况字段要比下面的多好多。

人员表:t_person
SQL code

personid int, //主键,人员ID
name varchar(32) //人员姓名



科目一考试表:t_km1
SQL code

id int, //主键,自增
personid int,//人员ID
status tinyint,//考试状态 0:未通过 1:通过
examdate datetime//考试日期



科目二考试表:t_km2
SQL code

id int, //主键,自增
personid int,//人员ID
status tinyint,//考试状态 0:未通过 1:通过
examdate datetime//考试日期



SQL语句的功能是:将科目一和科目二考试已经通过的人过滤掉,显示出那些有一科未通过或有两科未通过的人员。
我的SQL语句是这样写的:
SQL code

select * from v_km12 a where not exists (select personid from t_km1 where personid=a.personid and status=1 and exists (select personid from t_km2 where personid=a.personid and status=1))



其中v_km12是对以上三个表建立的视图,视图的内容是显示人员名称和最后一次的考试时间、考试成绩。视图没有问题。

------解决方案--------------------
Sub-Select 效率不是很高。
你试试这个:

SQL code
with table as
(
  select personid from t_km1
  where status = 0
  union
  select personid from t_km2
  where status = 0  
)
select * 
from t_Person
inner join table on table.personid = t_Person.personid