公司不让使用not exists,因为效率低,请问是否有其它办法能高效的替代以下这条语句?select * from (select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS from SQT_CMMD_SEND_RELATION as S 
inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID where S.BUYER_ID = 45 ) as A 
where not exists ( select 1 from SQT_Department_Commerce as D where A.ID = D.CMMD_ID  )

解决方案 »

  1.   

    公司不让使用not exists,   因为效率低???
      

  2.   

    --用join
    select * 
    from (
    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS 
    from SQT_CMMD_SEND_RELATION S 
    join SQT_TradeCommodity as T on S.CMMD_ID = T.ID where S.BUYER_ID = 45 
    ) A 
    join SQT_Department_Commerce D on A.ID <> D.CMMD_ID
      

  3.   

    select * from (select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID where S.BUYER_ID = 45 ) as A 
    where int ( select 1 from SQT_Department_Commerce as D where A.ID <> D.CMMD_ID  )
      

  4.   

    select * from (select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID where S.BUYER_ID = 45 ) as A 
    where in ( select 1 from SQT_Department_Commerce as D where A.ID <> D.CMMD_ID  )
      

  5.   

    不让用是规定
    不等于 和 not in 都是不可以的
    据说是临时表
    可我又想一条语句搞定

    大家想想办法帮忙
      

  6.   


    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS 
    from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID 
            left join (select distinct CMMD_ID  SQT_Department_Commerce )as D on T.ID = D.CMMD_ID
           where S.BUYER_ID = 45 and D.CMMD_ID is null
    不要说用not in.那更慢
      

  7.   

    汗一个,用join是错的,好久没抢分,脑子都锈了。
      

  8.   

    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS from SQT_CMMD_SEND_RELATION as S 
       inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID 
       Left join SQT_Department_Commerce as D ON A.ID = D.CMMD_ID 
    Where S.BUYER_ID = 45 AND D.CMMD_ID is NUll 
      

  9.   

    用left join,不存在的时候 D.CMMD_ID is null,试试看select * from (
    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS 
    from SQT_CMMD_SEND_RELATION as S inner join SQT_TradeCommodity as T 
    on S.CMMD_ID = T.ID where S.BUYER_ID = 45 
    ) as A 
    left join SQT_Department_Commerce as D 
    on A.id = D.CMMD_ID
    where D.CMMD_ID is null
      

  10.   

    exists在一对一的情况下可以用join代替,
    但not exists是不能用join代替的,无论是怎么join。
      

  11.   

    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS from SQT_CMMD_SEND_RELATION as S
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID where S.BUYER_ID = 45 
    left join SQT_Department_Commerce as D on S.CMMD_ID=D.CMMD_ID
    where D.CMMD_ID is null
      

  12.   

    ----如果SQT_Department_Commerce的CMMD_ID是唯一的
    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,
    T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS 
    from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID 
    LEFT JOIN SQT_Department_Commerce as D ON A.ID = D.CMMD_ID
    WHERE S.BUYER_ID = 45 AND D.CMMD_ID IS NULL----否则加DISTINCT
    select DISTINCT T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,
    T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS 
    from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID 
    LEFT JOIN SQT_Department_Commerce as D ON A.ID = D.CMMD_ID
    WHERE S.BUYER_ID = 45 AND D.CMMD_ID IS NULL
      

  13.   

    同志们,我都说用join是不对的。大家想想一对多的情况,用not exists,如果子查询中有一条匹配,一条不匹配,那么外层这条记录就不会出现在结果集中,如果用left join,右边一条匹配,一条不匹配(NULL),那么左边的这条记录就会出现在结果集中,这根not exists的结果不一致啊。
      

  14.   

    select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS 
    from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID 
            left join (select distinct CMMD_ID  SQT_Department_Commerce )as D on T.ID = D.CMMD_ID
           where S.BUYER_ID = 45 and D.CMMD_ID is null
    -----------------------------------------
    exists在一对一的情况下可以用join代替,
    但not exists是不能用join代替的,无论是怎么join。
    ------------------------------------------------------
    这里以distinct 了
      

  15.   

    mengmou()mengmou() ( ) 信誉:98    Blog   加为好友  2007-06-29 12:01:53  得分: 0  
     
     
       同志们,我都说用join是不对的。大家想想一对多的情况,用not exists,如果子查询中有一条匹配,一条不匹配,那么外层这条记录就不会出现在结果集中,如果用left join,右边一条匹配,一条不匹配(NULL),那么左边的这条记录就会出现在结果集中,这根not exists的结果不一致啊。
    -----------------------------------------------------------------------------------
    请注意:匹配的条件只是CMMD_ID.  
     
      

  16.   

    呵呵mengmou()mengmou() 今天脑子被雨淋锈了~
      

  17.   

    我应该是把left join当成cross join了,想想真可笑。
      

  18.   

    mengmou()mengmou()  又上马甲了~
      

  19.   

    select * from (
    select A.*, d.cmm_id from 
    (select T.ID,T.COMMERCE_NAME,T.BRAND,T.MANU_NAME,T.SPEC,T.MODEL,T.DEFAULT_MEASURE,T.PRICE,T.SALER_NAME,T.STATE,T.HASFITTINGS from SQT_CMMD_SEND_RELATION as S 
    inner join SQT_TradeCommodity as T on S.CMMD_ID = T.ID where S.BUYER_ID = 45 ) 
    as A  left join SQT_Department_Commerce d on  A.ID = D.CMMD_ID) ) t where cmmm_id is null
      

  20.   

    整理一下SELECT *
    FROM (SELECT A.*, d .cmm_id
            FROM (SELECT T .ID, T .COMMERCE_NAME, T .BRAND, T .MANU_NAME, T .SPEC, 
                          T .MODEL, T .DEFAULT_MEASURE, T .PRICE, T .SALER_NAME, 
                          T .STATE, T .HASFITTINGS
                    FROM SQT_CMMD_SEND_RELATION AS S INNER JOIN
                          SQT_TradeCommodity AS T ON S.CMMD_ID = T .ID
                    WHERE S.BUYER_ID = 45) AS A LEFT JOIN
                  SQT_Department_Commerce d ON A.ID = D .CMMD_ID)) t
    WHERE cmmm_id IS NULL
      

  21.   

    先结贴了
    三层嵌套不知道和not exists比会怎么样。。
      

  22.   

    晕,一分都没有,难道因为我不是星星. 这样写比not exists性能好很多,数据量越大越明显,