удаление строк в родительско-дочерних таблицах, найденных в других родительско-дочерних таблицах

#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, особенно с большими наборами данных.