Я столкнулся с ситуацией, когда есть главная таблица под названием 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
, если записи уже вставлены надеюсь информация поможет, спасибо