#sql #teradata
#sql #teradata
Вопрос:
Я загружаю данные в родительско-дочернюю пару таблиц в «промежуточной» схеме базы данных. Если есть повторяющиеся записи, которые ранее были загружены в родительско-дочернюю пару таблиц в «основной» схеме базы данных, я хочу удалить их из «промежуточных» таблиц базы данных.
Этот запрос
SELECT A.*,B.*
FROM STG.AUTO_REPR_PAR_STG A
JOIN STG.AUTO_REPR_CHLD_STG B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM
WHERE EXISTS ( SELECT A.*, B.*
FROM MST.AUTO_REPR_PAR A
JOIN MST.AUTO_REPR_CHLD B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM
)
покажет, что находится в промежуточном режиме, который ранее был загружен в master. Но как мне удалить из родительско-дочерней пары таблиц в промежуточной базе данных? Я рисую «пробел»….Я пробовал это, но это бомбит («Таблицы, не разрешенные в предложении FROM»):
DELETE FROM STG.AUTO_REPR_PAR_STG A
JOIN STG.AUTO_REPR_CHLD_STG B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM
WHERE EXISTS (SELECT A.*, B.*
FROM MST.AUTO_REPR_PAR A
JOIN MST.AUTO_REPR_CHLD B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM
)
Серверная часть — Teradata v13. В настоящее время я изучаю опцию КАСКАДНОГО УДАЛЕНИЯ, но я даже не уверен, что она поддерживается….Есть идеи?
Комментарии:
1. Это так
joined tables not allowed in from clause
? Держу пари, что это так, и в этом случае вам нужно будет решить, как выполнить то же самое в вашемWHERE EXISTS
предложении.2. Вы нашли ответ на это?
3. вы пробовали каскад.??
4. К сожалению, наша версия Teradata db не поддерживает КАСКАД УДАЛЕНИЯ.
Ответ №1:
Невозможно удалить из нескольких таблиц одним оператором УДАЛЕНИЯ, вам нужен один для каждой таблицы:
DELETE FROM STG.AUTO_REPR_PAR_STG A
WHERE TEST_SEQ_NUM IN (
SELECT A.TEST_SEQ_NUM FROM MST.AUTO_REPR_PAR A JOIN MST.AUTO_REPR_CHLD B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM )
;DELETE FROM STG.AUTO_REPR_CHLD_STG B
WHERE TEST_SEQ_NUM IN (
SELECT A.TEST_SEQ_NUM FROM MST.AUTO_REPR_PAR A JOIN MST.AUTO_REPR_CHLD B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM )
Если вы запустите это как запрос с несколькими операторами, соединение будет выполнено только один раз.
Комментарии:
1. Это имеет смысл!! Я попробую и сообщу об этом в течение следующих 24 часов.
2. Сначала удалите из дочернего элемента, затем из родительского. 😉
3. @Janine Rawnsley: Вы правы, я просто использовал cut amp; paste 🙂 И я предположил, что отношение родитель-потомок является просто логическим, они вряд ли реализованы в модели данных в хранилище данных. В противном случае вы могли бы просто удалить с помощью дочерней таблицы без присоединения к родительской 🙂
4. Предоставлено вознаграждение dnoeth. Приносим извинения за задержку. Спасибо всем.
Ответ №2:
Вы можете попробовать что-то вроде этого:
- Вместо подзапроса с предложением EXIST вы можете использовать ВНЕШНЕЕ СОЕДИНЕНИЕ — вы выбираете все строки с нулевыми столбцами в целевой внешней таблице, то есть строки, не совпадающие;
- Вы сохраняете результат предыдущего запроса во временную таблицу и выполняете 2 инструкции DELETE.
ВНЕШНЕЕ СОЕДИНЕНИЕ намного эффективнее по сравнению с подзапросом с EXISTS, особенно с большими наборами данных.