Вставьте недубликаты в основную таблицу с помощью MERGE / INSERT из инкрементальной таблицы в Teradata - PullRequest
0 голосов
/ 05 мая 2020

Я столкнулся с ситуацией, когда есть главная таблица под названием MORTALITY (содержащая информацию об умерших) и другую таблицу под названием INC_MORTALITY (инкрементная смертность), которая обновляется еженедельно. Примечание: Обе таблицы имеют похожие формат

Итак, INC_MORTALITY содержит новые записи этой недели, содержащие как дополнительных умерших лиц, так и обновления старых данных для ранее доставленных записей. Это единственный файл со столбцом (OP_DIRECTIVE), в котором указывается, является ли это записью «добавить» или «удалить».

Обработка еженедельных файлов Для включения файла еженедельного обновления: нам нужно добавить строки в главную таблицу которые имеют OP_DIRECTIVE = 'A' в качестве операции в еженедельном обновлении. В настоящее время я использую приведенный ниже stmt, чтобы ВСТАВИТЬ записи

INSERT INTO db.MORTALITY
    SELECT
    DATA_SOURCE,
    OP_DIRECTIVE,
    DD_IMP_FLAG,
    DOB,
    DOD,
    DEATH_VERIFICATION,
    GENDER_PROBABILITY,
    GENDER,
    TOKEN_1,
    TOKEN_2,
    TOKEN_4,
    TOKEN_5,
    TOKEN_7,
    TOKEN_16,
    TOKEN_KEY
    FROM db.INC_MORTALITY INC
    WHERE INC.OP_DIRECTIVE = 'A';
--The above Query fetches all the records to be added to the Master Table - MORTALITY(My Requirement) and for some reason if INC_MORTALITY is not refreshed after a week i will be updating the same records again to the master file.

Теперь я обновил primary index (token_1, token_2) в своем определении таблицы, я знаю, что он выдаст ERROR , если мы попытаемся вставлять записи с теми же значениями token_1 и token_2, но это будет автоматизированный процесс, и моя работа будет FAIL , если есть ERROR , поэтому я хочу, чтобы он проверил PRIOR до Insert обработать, если записи уже вставлены, так что он пропустит вставку дубликатов, как при использовании IFNOTEXISTS stmt

Добавление к вышесказанному: Могу ли я использовать здесь операцию MERGE WHEN NOT MATCHED THEN INSERT, как показано ниже:

MERGE db.MORTALITY B
USING (SELECT
    DATA_SOURCE,
    OP_DIRECTIVE,
    DD_IMP_FLAG,
    DOB,
    DOD,
    DEATH_VERIFICATION,
    GENDER_PROBABILITY,
    GENDER,
    TOKEN_1,
    TOKEN_2,
    TOKEN_4,
    TOKEN_5,
    TOKEN_7,
    TOKEN_16,
    TOKEN_KEY
    FROM db.INC_MORTALITY
    WHERE OP_DIRECTIVE = 'A') A
    ON  A.TOKEN_1 = B.TOKEN_1
    AND A.TOKEN_2 = B.TOKEN_2
WHEN NOT MATCHED THEN
INSERT (A.DATA_SOURCE,A.OP_DIRECTIVE,A.DD_IMP_FLAG,A.DOB,A.DOD,A.DEATH_VERIFICATION,A.GENDER_PROBABILITY,A.GENDER,A.TOKEN_1,A.TOKEN_2,A.TOKEN_4,A.TOKEN_5,A.TOKEN_7,A.TOKEN_16,A.TOKEN_KEY);

Вышеупомянутый запрос отлично выполняется в Teradata Studio, но не вставляет никаких записей из таблицы INC_MORTALITY TO MORTALITY (master), я что-то делаю не так?

UPDATE:


DROP TABLE IF EXISTS MORTALITY;


CREATE MULTISET  TABLE MORTALITY,
    NO BEFORE JOURNAL,
    NO AFTER JOURNAL,
    NO FALLBACK,
    CHECKSUM = DEFAULT
(

    DATA_SOURCE          VARCHAR(25) NULL 
        TITLE 'Data Source',
    OP_DIRECTIVE         VARCHAR(25) NULL 
        TITLE 'Operation Directive',
    DD_IMP_FLAG          INTEGER NULL 
        TITLE 'Death Date Imputation Flag',
    DOB                  DATE NULL 
        TITLE 'Date Of Birth',
    DOD                  DATE NULL 
        TITLE 'Date Of Death',
    DEATH_VERIFICATION   INTEGER NULL 
        TITLE 'Death Verification',
    GENDER_PROBABILITY   FLOAT NULL 
        TITLE 'Gender Probability Score',
    GENDER               VARCHAR(25) NULL 
        TITLE 'Gender',
    TOKEN_1              VARCHAR(44) NULL 
        TITLE 'Token 1',
    TOKEN_2              VARCHAR(44) NULL 
        TITLE 'Token 2',
    TOKEN_4              VARCHAR(44) NULL 
        TITLE 'Token 4',
    TOKEN_5              VARCHAR(44) NULL 
        TITLE 'Token 5',
    TOKEN_7              VARCHAR(44) NULL 
        TITLE 'Token 7',
    TOKEN_16             VARCHAR(44) NULL 
        TITLE 'Token 16',
    TOKEN_KEY            VARCHAR(44) NULL 
        TITLE 'Token Key'
)
    PRIMARY INDEX MORTALITY_IX1
     (
            TOKEN_1,
            TOKEN_2
     );

Это таблица DDL для MORTALITY и INC_MORTALITY также имеет аналогичный формат. Комбинация обоих столбцов TOKEN_1 и TOKEN_2 идентифицирует уникальную запись, и, как вы можете видеть выше, все они являются столбцами NULLABLE. Как я уже говорил, мой самый первый INSERT stmt служит этой цели, но я просто хочу избежать появления такой ошибки: Duplicate unique prime key error in db.MORTALITY, если записи уже вставлены надеюсь информация поможет, спасибо

1 Ответ

0 голосов
/ 12 мая 2020

Я сам провел НЕКОТОРЫЕ исследования и выяснил следующие подходы:

1) Использование INSERT Этот запрос сработал для меня, он вставляет только записи, которые находятся в INC_MORTALITY, но не в MORTALITY (избегая дублирования)

    INSERT INTO db.MORTALITY 
    SELECT * FROM db.INC_MORTALITY INC
    WHERE INC.OP_DIRECTIVE = 'A'
    EXCEPT
    SELECT * FROM db.MORTALITY_INDEX

2) Аналогичным образом с помощью MERGE

MERGE db.MORTALITY MI
USING (SELECT
    DATA_SOURCE,
    OP_DIRECTIVE,
    DD_IMP_FLAG,
    DOB,
    DOD,
    DEATH_VERIFICATION,
    GENDER_PROBABILITY,
    GENDER,
    TOKEN_1,
    TOKEN_2,
    TOKEN_4,
    TOKEN_5,
    TOKEN_7,
    TOKEN_16,
    TOKEN_KEY
    FROM db.INC_MORTALITY
    WHERE OP_DIRECTIVE = 'A') INC
    ON  MI.DATA_SOURCE        = INC.DATA_SOURCE
    AND MI.DD_IMP_FLAG        = INC.DD_IMP_FLAG
    AND MI.DOB                = INC.DOB
    AND MI.DOD                = INC.DOD
    AND MI.DEATH_VERIFICATION = INC.DEATH_VERIFICATION
    AND MI.GENDER_PROBABILITY = INC.GENDER_PROBABILITY
    AND MI.GENDER             = INC.GENDER
    AND MI.TOKEN_1            = INC.TOKEN_1
    AND MI.TOKEN_2            = INC.TOKEN_2
    AND MI.TOKEN_4            = INC.TOKEN_4
    AND MI.TOKEN_5            = INC.TOKEN_5
    AND MI.TOKEN_7            = INC.TOKEN_7
    AND MI.TOKEN_16           = INC.TOKEN_16
    AND MI.TOKEN_KEY          = INC.TOKEN_KEY
WHEN NOT MATCHED THEN
INSERT (DATA_SOURCE,
        OP_DIRECTIVE,
        DD_IMP_FLAG,
        DOB,
        DOD,
        DEATH_VERIFICATION,
        GENDER_PROBABILITY,
        GENDER,
        TOKEN_1,
        TOKEN_2,
        TOKEN_4,
        TOKEN_5,
        TOKEN_7,
        TOKEN_16,
        TOKEN_KEY) 
VALUES (INC.DATA_SOURCE,
        INC.OP_DIRECTIVE,
        INC.DD_IMP_FLAG,
        INC.DOB,
        INC.DOD,
        INC.DEATH_VERIFICATION,
        INC.GENDER_PROBABILITY,
        INC.GENDER,
        INC.TOKEN_1,
        INC.TOKEN_2,
        INC.TOKEN_4,
        INC.TOKEN_5,
        INC.TOKEN_7,
        INC.TOKEN_16,
        INC.TOKEN_KEY);

Спасибо всем, кто внес свой вклад в мой вопрос !!

...