Создание INSERT INTO как ошибки / дубликата, насколько это возможно, без ID - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть хранимая процедура, которая вставляет от tableA до tableB.Каждый раз, когда процедура выполняется (поскольку таблица A будет постоянно обновляться, поэтому при выполнении процедуры она будет добавлять отсутствующие данные в 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 и пропустить дублированные строки, приветствуется.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вставка всех записей в каждую вставку таблицы A довольно затратна.Вы можете использовать команду «Scope_Identity», если вы используете T-SQL (сервер SQL).Вам нужно добавить каждую запись в обе таблицы в одном вызове.Добавьте значения в таблицу 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 голосов
/ 19 февраля 2019

Вам необходимо иметь столбец версии в таблице A с типом отметки времени и соответствующий столбец в таблице B с типом varbinary (8).При таком предположении должен работать следующий код:

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.Version > (SELECT MAX(Version) FROM TABLEB)
0 голосов
/ 19 февраля 2019

Я не уверен, в чем ваша проблема, но это должно работать.Вы проверяете, что было последним вставлено в таблицу B, а затем получили все новые записи.

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