我这个表有几百万条数据,包含删除的数据,现在就是要过虑掉插入后被删除过的数据,类型为INS01,DEL01,DEL01发生在INS01之后,根据相关条件过滤,请看如下语句,用的是not exists select * from (
select * from cdb.dbo.ERPContract E  
where not exists
(
select * from 
(
select R.id from 
(
SELECT * FROM  cdb.dbo.ERPContract 
where CRMODE IN('DEL01')
)T 
inner join cdb.dbo.ERPContract R
on T.CUSTOMER=R.CUSTOMER AND
T.STYLE=R.STYLE AND
T.KIND=R.KIND AND 
T.COLOR=R.COLOR AND
R.CRMODE IN('INS01') AND R.ID<T.ID
)A where E.Id = A.id
)
)B 
where B.id not in 
(
SELECT C.id FROM cdb.dbo.ERPContract C
where CRMODE IN('DEL01')
)
先过滤插入后被删除的数据,再过滤删除数据,求优化

解决方案 »

  1.   


    select * from cdb.dbo.ERPContract E  
    where not exists
    (
    select 1 from 
    (
        select R.id from 
        (
    SELECT C.id FROM cdb.dbo.ERPContract C
    where CRMODE = 'DEL01'
    ) T 
        left join cdb.dbo.ERPContract R
        on T.CUSTOMER=R.CUSTOMER AND
        T.STYLE=R.STYLE AND
        T.KIND=R.KIND AND 
        T.COLOR=R.COLOR AND
        R.CRMODE = 'INS01' AND R.ID<T.ID    
    )A where E.Id = A.id
    )               declare ids table
    (
    id varchar(50)
    )
    insert into ids
    SELECT C.id FROM cdb.dbo.ERPContract C
    where CRMODE = 'DEL01'select * from cdb.dbo.ERPContract E  
    where not exists
    (
    select 1 from 
    (
        select R.id from 
        ids T 
        left join cdb.dbo.ERPContract R
        on T.CUSTOMER=R.CUSTOMER AND
        T.STYLE=R.STYLE AND
        T.KIND=R.KIND AND 
        T.COLOR=R.COLOR AND
        R.CRMODE = 'INS01' AND R.ID<T.ID    
    )A where E.Id = A.id
    )   试试上面两个 
      

  2.   

    可以的话 在CRMODE字段上建立索引 效果会更好
      

  3.   

       select * from cdb.dbo.ERPContract a where not exists(select 1 from cdb.dbo.ERPContract where ID=a.ID and CRMODE='DEL01')好像是这样,楼主自己测测
      

  4.   

     R.ID 和T.ID 建立聚集索引,,