Как создать таблицу из таблицы с «регистром», чтобы копировать и изменять исходные данные в Oracle?

#database #oracle12c

#База данных #oracle12c

Вопрос:

Поскольку у меня есть таблица с миллионами записей, я искал решение для более эффективного обновления данных в одном столбце, без использования табличного пространства ОТМЕНЫ и инструкции ОБНОВЛЕНИЯ.

Моя идея заключалась в создании второй таблицы (копии) X из целевой таблицы Y следующим образом:

 create table X as
select col1,col2,col3, (case when col4 is not null and createdate < sysdate - 180 then null else col4) as col4 from Y;
  

Затем удалите таблицу Y и переименуйте X в Y. Он создает таблицу, но мой тестовый запрос

 select count(col4) from Y where col4 is not null and createdate < sysdate - 180
  

Показывает, что все еще есть некоторые записи с исходным значением (похоже, предложение case не работает так, как предполагалось). Когда я использую тот же select в подзапросе и точно такое же условие, например

 select count(col4) from (select col1,col2,col3, (case when col4 is not null and createdate < sysdate - 180 then null else col4) as col4 from Y) where col4 is not null and createdate < sysdate - 180
  

Результат равен 0. Я что-то делаю неправильно?

Комментарии:

1. Вы не хотите использовать отмену табличного пространства, но хотите создать новую таблицу с миллионами записей? Почему?

2. На данный момент это база данных, используемая только мной, и у меня достаточно места. Я бы хотел сделать это «самым быстрым» способом. Также отмена изменения размера в моем случае невозможна.

Ответ №1:

Ну, я думаю, я это понял:

Проблема здесь в sysdate, поскольку я попытался сначала клонировать таблицу (sysdate1), а затем проверить данные с помощью sysdate в условиях where (sysdate2 отличается от первого)

Подзапрос выведите 0, поскольку для обоих условий требуется одинаковое значение sysdate.