我有' order_history'和' current_order'表格都有类似的列,如下所述: order_name,Consumer_name,order_date,Order_ amount
每次我收到新订单,我必须找出重叠的订单,并从历史表中删除这些重复,然后附加current_table数据,但现在这是最糟糕的,因为我的日期在当前表中被更改所以我必须考虑+ / - 比较order_date 14天,然后从历史表中删除它
请参见样品表数据
---当前订单
ORDER_NAME | CONSUMER_NAME | order_date的| ORDER_AMOUNT
羊毛| Jhon | 2017年6月15日| 500个
羊毛| Jhon | 2017年7月14日| 1000
羊毛| Jhon | 2017年8月13日| 800个
---订单历史
ORDER_NAME | CONSUMER_NAME | order_date | ORDER_AMOUNT
羊毛| Jhon | 5/15/2017 | 1200
羊毛| Jhon | 6/10/2017 | 500个
羊毛| Jhon | 7/8/2017 | 800
在上面的场景中,我需要从历史表中删除6月和7月(2010年6月10日和7月8日)的订单行,然后需要将当前订单表条目附加到历史表中。
我正在使用以下查询
select a.order_name, a.consumer_name, a.order_date , a.order_amount
from order_history a inner join current_order b
on ( upper(a.order_name) = upper(b.order_name) and
upper(a.consumer_name) = upper(b.consumer_name))
where
upper(a.order_name) = upper(b.order_name) and
upper(a.consumer_name) = upper(b.consumer_name)
and a.order_date -b.order_date <= 14 and a.order_date -b.order_date >= -14
但我得到重复的行
你可以帮我解决这个问题吗?一个解决方案可以是笛卡尔积,其中每一行将与另一个表的所有行进行比较,但由于数据大小为百万行,此查询将花费大量时间答案 0 :(得分:0)
使用ABS
将日期之间的差异作为正数。如果您只想从历史记录表中删除,请使用EXISTS
查找当前订单表。
delete
from order_history h
where exists
(
select *
from current_order c
where c.order_name = h.order_name
and c.consumer_name = h.consumer_name
and abs(c.order_date - h.order_date) <= 14
);