【问题标题】:Handling duplicate inserts of records by timestamp in DB2在 DB2 中按时间戳处理记录的重复插入
【发布时间】:2018-07-04 20:17:03
【问题描述】:

使用 DB2 9.7.5,我有两个表,主表和导入表。每小时我都会得到一个插入到导入表中的数据转储。然后我将导入表中的记录合并到主表中。为了区分主表中的现有记录,所有记录的时间戳都精确到秒。

两个表都是这样定义的:

CREATE TABLE ... (
    STATUS VARCHAR(1000) NOT NULL,
    ACTION_DATE TIMESTAMP NOT NULL
) IN SOME_TABLE_SPACE;

在将导入表合并到主表之前,我删除了导入表中的现有记录。

DELETE FROM IMPORTING
WHERE (ACTION_DATE) IN
    (SELECT ACTION_DATE FROM MASTER);

导入表中的唯一记录应该是新记录,因此我将导入表中的记录插入到主表中。

INSERT INTO MASTER (STATUS, ACTION_DATE)
SELECT STATUS, ACTION_DATE FROM IMPORTING;

我不时遇到的问题是我得到重复记录,因为 ACTION_DATE 有时在主表和导入表之间最多相差 2 秒

那么如何从导入表中删除主表中时间戳偏移量为 2 秒的记录?

【问题讨论】:

  • 与此无关,您看过 MERGE 语句吗?
  • @data_henrik 一个 MERGE 对相等起作用不是吗?
  • 你如何确定它们是重复的?您是否应该使用代理键或自然键进行合并?
  • 无论您使用什么来确定它们是重复的,都应该是您的 Delete 语句用来将它们从导入表中删除的内容。
  • @Wes H 和毛,ACTION_DATE 有点像一个键,但有时相同的记录会重复,因为 ACTION_DATE 关闭了几秒钟。我正在考虑使用 SECONDS 函数并确定差异是否在 2 以内,那么它们将是相同的。我只是不知道如何在删除中实现它。

标签: database insert timestamp db2 db2-luw


【解决方案1】:

为避免重复问题,您可以更改插入 sql 以仅插入主表中不存在的记录。

INSERT INTO MASTER(状态,ACTION_DATE) 选择状态,ACTION_DATE FROM IMPORTING I 不存在的地方 (从主 M 中选择 1 其中 m.ACTION_DATE = i.ACTION_DATE);

【讨论】:

  • 主表中时间戳为'2018-01-25 13:14:43'的记录等于导入表中时间戳为'2018-01-25 13'的记录:14:42'。如果我要插入,那么记录将被插入,但如果我可以确定该记录在 2 秒的时间差内,那么它认为是相同的,不会被插入。
  • INSERT INTO MASTER (STATUS, ACTION_DATE) SELECT STATUS, ACTION_DATE FROM IMPORTING I WHERE 不存在(从 MASTER M 中选择 1,其中 m.ACTION_DATE 在 i.ACTION_DATE 和 i.action_date + 2 秒之间);
猜你喜欢
  • 2015-01-04
  • 2013-09-09
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多