1

一連の注文を取得するために次のクエリを使用しています。

select count(distinct po.orderid) 
from PostOrders po, 
     ProcessedOrders pro 
where pro.state IN ('PENDING','COMPLETED') 
  and po.comp_code in (3,4) 
  and pro.orderid = po.orderid

クエリは 4323 という結果を返しますが、これは十分に高速です。

ただし、クエリに追加の条件を追加する別のテーブル DiscarderOrders に存在しない場合にのみ返されるように、別の条件を設定する必要があります。

select count(distinct po.orderid) 
from PostOrders po, 
     ProcessedOrders pro 
where pro.state IN ('PENDING','COMPLETED') 
  and po.comp_code in (3,4) 
  and pro.orderid = po.orderid 
  and po.orderid not in (select do.order_id from DiscardedOrders do)

上記のクエリは多くの時間を要し、実行を続けます。クエリを高速に実行するためにできることはありますか? または、最初のクエリを最初に実行してから、別のクエリを実行して条件に基づいてフィルタリングする必要がありますか?

4

3 に答える 3

3

あなたは置き換えることができます:

and po.orderid not in (select do.order_id from DiscardedOrders do)

and not exists (select 1 from DiscardedOrders do where do.order_id = po.orderid)
于 2013-05-14T07:08:38.387 に答える
2

JOINよりも使ってみてくださいNOT IN

SELECT  COUNT(DISTINCT po.orderid) TotalCount
FROM    PostOrders po
        INNER JOIN ProcessedOrders pro
            ON po.orderid = pro.orderid
        LEFT JOIN DiscardedOrders do
            ON po.orderid = do.orderid
WHERE   po.comp_code IN (3,4) AND
        pro.state IN ('PENDING','COMPLETED') AND
        do.orderid IS NULL

またNOT EXISTS

SELECT  COUNT(DISTINCT po.orderid) TotalCount
FROM    PostOrders po
        INNER JOIN ProcessedOrders pro
            ON po.orderid = pro.orderid
WHERE   po.comp_code IN (3,4) AND
        pro.state IN ('PENDING','COMPLETED') AND
        NOT EXISTS
        (
            SELECT  1
            FROM    DiscardedOrders do
            WHERE   po.orderid = do.orderid
        )
于 2013-05-14T07:09:13.367 に答える