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

尝试使用JOINNOT 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 回答
0

与不同的相同:

SELECT count(po.orderid) 
  FROM PostOrders po 
 WHERE po.comp_code IN (3,4) 
   AND EXISTS 
   (
   SELECT 1 FROM ProcessedOrders pro 
    WHERE pro.orderid = po.orderid
      AND pro.state IN ('PENDING','COMPLETED') 
   )
  ....
 /
于 2013-05-14T13:28:46.030 回答