我有一个存储过程从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和跳过重复行的逻辑的帮助表示赞赏。
我不确定你的问题是什么,但这应该有效。您检查表B中插入的最后一个是什么,然后获得所有新记录。
INSERT INTO TABLEB (VALUES)
SELECT A.VALUES
FROM A
WHERE TIMESTAMP > (SELECT MAX(TIMESTAMP) FROM TABLEB)
在表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
您需要在表A中具有时间戳类型的版本列和表B中具有varbinary类型(8)的相应列。有了这个假设,下面的代码必须工作:
INSERT INTO TABLEB (VALUES)
SELECT A.VALUES
FROM A
WHERE A.Version > (SELECT MAX(Version) FROM TABLEB)