0

これは、2つのサブクエリと一時テーブルを使用して機能する私のクエリです。

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);

このクエリを書き直して、サブクエリの一方または両方を削除する方法はありますか?同じ2つのサブクエリで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 に答える