我想要做的就是这个。 表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'))
答案 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
排除了很多行
h.ihent# = a.ADENT#
是否正确?h.IHVIAC not in ('PML','FCM')
是否正确?ADSFX# = '000'
是否正确?如果您需要检查h.IHDOCD是否在使用日期之间:
AND h.IHDOCD BETWEEN start_date AND end_date
将start_date和end_date格式化为正确的类型。
我有一些缺乏信息,所以如果我遗失了什么,请给我更多信息: