这是我的查询,它使用两个子查询和临时表:
select visit.pid, visit.pidvnum, visit.hpv16, visit.qc_hst
FROM visit,
(select distinct x.pid from
(select pid from visit where visit.qc_hst = 1) x,
(select pid from visit where visit.hpv16 = 1) y
where x.pid = y.pid) as subtbl
where visit.pid = subtbl.pid
AND (visit.qc_hst = 1 OR visit.hpv16 =1);
有没有办法重写此查询以消除一个或两个子查询?我也使用了具有相同两个子查询的IN子句,但情况更糟。我无法索引像qc_hst和hpv16这样的字段,因为它们有很多,而且其中任何一个都可能是查询的一部分。
这是一个sqlfiddle链接:http://sqlfiddle.com/#!2/68bd6/6/0
非常感谢 - 我真的在这个墙上碰到了我的头......
答案 0 :(得分:1)
您的查询似乎正在查找pid同时满足这些条件的记录。以下是另一种方法:
select v.pid, v.pidvnum, v.hpv16, v.qc_hst
from visit v join
(select v.pid
from visit v
where visit.qc_hst = 1 or visit.hpv16 = 1
group by pid
having SUM(v.qc_hst = 1) > 0 and sum(v.hpv16 = 1) > 0
) vp
on v.pid = vp.pid
where visit.qc_hst = 1 or visit.hpv16 = 1
visit(pid)
上的索引可能会帮助任何查询运行得更快。