#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.