注意问题
not in在字查询有null返回时,主查询将不会返回记录
改为表关联的时候,a.ordid 和 b.ordid 是不是至少有一个是唯一的。

解决方案 »

  1.   

    是的,我就是不想用NOT IN ,因为速度很慢,而且我还只想用一条语句实现这个功能。
    但是按照逻辑来说,这个时没有错的,即;
    ODSTATUS='Z' AND BOOKSN<>'3')的反就是:(a.odstatus<>'Z' or (a.odstatus='Z' and a.booksn='3'))
    是吗??
      

  2.   

    打个比如
    性别=女 and 年龄=20那反就是:所有不是20岁的女人的人的全部:应当是
    性别<>女(男) or (性别=女 and 年龄<>20)
    明白吗?
      

  3.   

    你的是<>
    逻辑是没有问题的,注意我开始提的两点,可能是你结果不同的原因
      

  4.   

    呵呵,离散数学!性别=女 and 年龄<>20 即意:年龄不等于20岁的所有女人
    反则                       年龄等于20岁非女人的人(那么包括男人、人妖、中性人)
      

  5.   

    select count(distinct a.ordid) as num 
    from order_m a, order_r b 
    where a.ordid=b.ordid and b.cktype='P' and b.orgid=2198  
    and SUBSTR(ORDATE,0,8)>='20020227' and SUBSTR(ORDATE,0,8)<='20030227'  and (a.odstatus<>'Z' or (a.odstatus='Z' and a.booksn='3')) 是不是少了
    A.ORDID NOT IN (SELECT ORDID FROM ORDER_M WHERE ORGID=2198 AND ODSTATUS='Z' AND BOOKSN<>'3' ); 中的ORGID=2198这个条件改为
    select count(distinct a.ordid) as num 
    from order_m a, order_r b 
    where a.ordid=b.ordid and b.cktype='P' and b.orgid=2198  
    and SUBSTR(ORDATE,0,8)>='20020227' and SUBSTR(ORDATE,0,8)<='20030227'  and (a.orgid<>2198 or a.odstatus<>'Z' or (a.orgid=2198 and a.odstatus='Z' and a.booksn='3')) 
    试试。
      

  6.   

    not in效率太低,这样看看:
    select count(*) from 
    (SELECT A.ORDID 
    FROM ORDER_M A,ORDER_R B 
    WHERE  A.ORDID=B.ORDID AND B.ORGID=2198 AND B.CKTYPE='P' 
    and SUBSTR(ORDATE,0,8)>='20020227' and SUBSTR(ORDATE,0,8)<='20030227'  
    minus
    SELECT ORDID FROM ORDER_M WHERE ORGID=2198 AND ODSTATUS='Z' AND BOOKSN<>'3' ) c
    group by c.oradid 
    试试
      

  7.   

    多谢各位,结贴了。
    另:
                性别=女 and 年龄<>20 即意:年龄不等于20岁的所有女人
          反则           
                年龄等于20岁非女人的人(那么包括男人、人妖、中性人),
          反之好像有点问题, 应该对于所有非女人的人,没有年龄限制才对的:)