2014-04-10 101 views
0

我想要做的是这样的。 表OEINHDIH是订单的历史。订单可以有许多订单类型的行。因此订单12345可以在其中包含INT,COR等类型。 我们需要的订单是INT,但没有对它的修正订单(COR COE)。但是,当我运行这个SQL我只得到1伊特尔#。此外,这必须在Crystal报表中运行,用户将根据日期和时间来驱动该报表,该报表是h.IHDOCD。SQL没有按预期返回行

select h.IHDOCD, h.IHENT#, h.IHSFX#, h.IHINV#, a.ADINTA     
from astdta.OEINHDIH h             
    join astdta.Adressad a             
    on h.ihent# = a.ADENT#             
where h.IHORDT = 'INT'              
    AND h.IHVIAC not in ('PML','FCM')          
    AND ADSFX# = '000'              
    and h.ihent# in (              
    select cor.ihent#              
     from astdta.OEINHDIH cor            
     where cor.IHORDT not in ('COR','COE'))      

回答

0

EDITED

我相信你的表astdta.OEINHDIH可以包含如下数据:

ihen# | IHORDT 
    1 | 'INT' 
    1 | 'COR' 
    2 | 'INT' 
    3 | 'INT' 
    3 | 'COE' 

在性能方面,你应该使用的left join +内容is null代替subquery排除修正订单

select h.IHDOCD, h.IHENT#, h.IHSFX#, h.IHINV#, a.ADINTA     
from astdta.OEINHDIH h 
    left join astdta.OEINHDIH cor -- get orders corrected 
     on h.ihent# = cor.ihent# 
     and cor.IHORDT in ('COR','COE')    
    join astdta.Adressad a             
     on h.ihent# = a.ADENT#             
where h.IHORDT = 'INT' 
    and cor.ihent# is null -- remove orders corrected         
    AND h.IHVIAC not in ('PML','FCM')          
    AND ADSFX# = '000'   

如果你缺少行,这意味着你join或您where均不含得多排

  1. h.ihent# = a.ADENT#是否正确?
  2. h.IHVIAC not in ('PML','FCM')是否正确?
  3. ADSFX# = '000'是否正确?

如果您需要检查h.IHDOCD是日期间使用:

AND h.IHDOCD BETWEEN start_date AND end_date 

与起始日期日期和结束日期格式化为正确的类型。

我有一些信息的缺乏,所以如果我失去了一些东西,给我更多的信息:

  • 你需要什么
  • 什么是你的数据表
  • 什么是你的表结构
  • 您的预期结果是什么