Удалить только один столбец из целевой таблицы, даже если есть несколько похожих столбцов (Teradata) - PullRequest
0 голосов
/ 16 апреля 2020

Я столкнулся с ситуацией, когда мне нужно удалить столбец из таблицы на основе условия из другой таблицы. Позвольте мне разбить его на вас!

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

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

Обработка еженедельных файлов Чтобы включить файл еженедельного обновления, нам нужно выполнить следующие шаги по порядку. 1. Удалите строки в основной таблице, которые имеют OP_DIRECTIVE = 'D' в качестве операции в еженедельном обновлении. Для данной строки удаления необходимо удалить одну строку в основной таблице, которая соответствует записи удаления во всех полях, кроме столбца операции «D». Предупреждение: убедитесь, что вы удаляете или помечаете как удаленную только одну запись, даже если более одной исторической записи полностью соответствует этой новой записи удаления. 2. Добавьте строки в основную таблицу, которые появятся в файле «Добавить». После выполнения этих шагов ваша мастер-таблица должна быть самой современной мастером смерти.

 (Примечание: ЭТИ ТАБЛИЦЫ НЕ ИМЕЮТ ПЕРВИЧНЫЕ КЛЮЧИ) ТАК ЧТО Я ПОПЫТАЛ:

DEL FROM MORTALITY MI
WHERE MI.DATA_SOURCE    = INC_MORTALITY.DATA_SOURCE
AND MI.DD_IMP_FLAG      = INC_MORTALITY.DD_IMP_FLAG
AND MI.DOB              = INC_MORTALITY.DOB
AND MI.DOD                = INC_MORTALITY.DOD
AND MI.DEATH_VERIFICATION = INC_MORTALITY.DEATH_VERIFICATION
AND MI.GENDER_PROBABILITY = INC_MORTALITY.GENDER_PROBABILITY
AND MI.GENDER           = INC_MORTALITY.GENDER
AND MI.TOKEN_1          = INC_MORTALITY.TOKEN_1
AND MI.TOKEN_2          = INC_MORTALITY.TOKEN_2
AND MI.TOKEN_4          = INC_MORTALITY.TOKEN_4
AND MI.TOKEN_5          = INC_MORTALITY.TOKEN_5
AND MI.TOKEN_7          = INC_MORTALITY.TOKEN_7
AND MI.TOKEN_16         = INC_MORTALITY.TOKEN_16
AND MI.TOKEN_KEY        = INC_MORTALITY.TOKEN_KEY
AND INC_MORTALITY.OP_DIRECTIVE = 'D'

Вышеуказанный оператор Delete удалит все строки, удовлетворяющие условиям, мое требование состоит в том, чтобы удалить только одну запись, даже если более одной исторической записи полностью соответствует этой новой записи удаления, и если я включил ROW NUMBER () stmt, как показано ниже моего DELETE STMT не работает

QUALIFY ROW_NUMBER() OVER (PARTITION BY MI.DATA_SOURCE,MI.DOB,MI.DOD
ORDER BY MI.DOD DESC ) = 1

Любые предложения о том, как подходить к этому сценарию, спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Подход к решению: скопируйте несопоставленные строки в рабочую таблицу, затем обрежьте исходную таблицу и замените ее содержимым. Один из способов идентифицировать несопоставленные строки - пометить каждую входную строку в наборе дубликатов уникальным номером, например:

INSERT work_table SELECT MI.col1, MI.col2, ...
FROM 
  (SELECT M.*,
   ROW_NUMBER() OVER (PARTITION BY <join cols> ORDER BY <some col(s)>) AS ROWNUM
   FROM MORTALITY M) MI
LEFT JOIN 
  (SELECT I.*, 
   ROW_NUMBER() OVER (PARTITION BY <join cols> ORDER BY <some col(s)>) AS ROWNUM
   FROM INC_MORTALITY I
   WHERE OP_DIRECTIVE='D') INC
ON MI.join_col1 = INC.join_col1
AND MI.join_col2 = INC.join_col2
...
AND MI.ROWNUM = INC.ROWNUM
WHERE INC.ROWNUM IS NULL /* "anti-join" keeps only unmatched rows */
;
DELETE FROM MORTALITY;
INSERT MORTALITY SELECT * FROM work_table;

Если в INC_MORTALILTY никогда не было дубликатов, вы можете исключить нумерацию, которая свяжите и измените условие последнего соединения на MI.ROWNUM = 1 и используйте один из других столбцов JOIN для проверки NULL.

...