在没有ID的情况下将INSERT INTO作为错误/重复证明

问题描述 投票:1回答:3

我有一个存储过程从tableA插入到tableB。每次执行该过程时(因为tableA将不断更新,所以当程序运行时它会将缺失的数据添加到B中),它会将A的全部内容插入到B中,无论如何。

所以在插入中我添加了一个WHERE语句来根据添加记录的时间戳来过滤“旧数据”(插入新记录,其中tableA的时间戳大于tableB上的时间戳)。该表没有唯一的标识符,所以我有点卡住使过滤器尽可能安全,基本上我唯一能考虑的是时间戳。我已经尝试了一些方法但是所有这些都有它们的缺点(在每个代码块中都有注释)。

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE (SELECT MAX(TIMESTAMP) FROM TABLEB) < (SELECT MAX(TIMESTAMP) FROM TABLEA)

--THIS DOESN'T EVEN WORK
INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)

--IF RUN TWICE IT WILL RUN ON RECORDS CONTAINING TIMESTAMPS WITH THOSE VALUES
INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
      AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEA)

--THIS WILL EFFECTIVELY SKIP RECORDS WITH THE TIMESTAMP FROM TABLEA BUT RUN TWICE WILL DUPLICATES THE ONES WITH TIMESTAMP FROM B

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
      AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEA)
      AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEB)

--THIS WILL SKIP DATA WITH THE TIMESTAMP FROM B

任何有关运行ONCE和跳过重复行的逻辑的帮助表示赞赏。

sql sql-server stored-procedures insert where
3个回答
1
投票

我不确定你的问题是什么,但这应该有效。您检查表B中插入的最后一个是什么,然后获得所有新记录。

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE TIMESTAMP > (SELECT MAX(TIMESTAMP) FROM TABLEB)

0
投票

在表A的每个插入上插入所有记录的成本非常高。如果您使用的是T-SQL(sql server),则可以使用“Scope_Identity”命令。您需要在同一个调用中的两个表中添加每个记录。向表A添加值,然后添加到表B.

这是一个例子:

INSERT INTO TABLEA (column-names) 
VALUES (values)

DECLARE @LAST_RECORD_ID INT=0

SELECT @LAST_RECORD_ID = SCOPE_IDENTITY()

INSERT INTO TABLEB (column-names) 

SELECT 
    (column-names)
FROM TABLEA WHERE TABLEA.ID = @LAST_RECORD_ID

0
投票

您需要在表A中具有时间戳类型的版本列和表B中具有varbinary类型(8)的相应列。有了这个假设,下面的代码必须工作:

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.Version > (SELECT MAX(Version) FROM TABLEB)
© www.soinside.com 2019 - 2024. All rights reserved.