0

这是我的查询,它使用两个子查询和临时表:

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

非常感谢 - 我真的把我的头撞到墙上了......

4

1 回答 1

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)可能会帮助任何查询运行得更快。

于 2013-03-25T20:45:53.730 回答