2017-07-12 47 views
0

我都如下面提及的具有類似於列具有「order_history」和「current_order」表我得到新的訂單,我必須找到重疊的訂單,並從歷史表中刪除這些重複,然後追加current_table數據,但現在這是最糟糕的,因爲我的日期在當前表中發生變化,所以我必須考慮+/- 14天order_date的比較,然後從歷史表 刪除,請參閱樣本表數據

---目前訂單
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/10/2017和7/8/2017)月份的訂單行,然後需要將當前訂單表條目應用到歷史表中。

我使用下面的查詢

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

您在查詢中有重複的條件,但這並不影響結果。看起來你有時在current_order中有多個記錄與order_history中的一條記錄匹配,所以當你加入它們時,你會在結果中獲得重複的歷史記錄。 –

回答

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