sql没有按预期返回行

时间:2014-04-10 22:07:02

标签: sql crystal-reports-xi

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

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'))                    

1 个答案:

答案 0 :(得分: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'是否正确?
  4. 如果您需要检查h.IHDOCD是否在使用日期之间:

        AND h.IHDOCD BETWEEN start_date AND end_date
    

    将start_date和end_date格式化为正确的类型。

    我有一些缺乏信息,所以如果我遗失了什么,请给我更多信息:

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