1) Хорошо, так что вы не можете сделать это напрямую. Нам не нужно пост за постом говорить то же самое, не так ли?
2) Хорошо, так что порядок столбцов в таблице технически не имеет значения. Но не в этом суть, первоначальный вопрос просто задавался вопросом, можете ли вы сделать это или нет. Не думайте, что вы знаете требования всех остальных. Возможно, у них есть таблица из 100 столбцов, которая в настоящее время запрашивается с помощью «SELECT * ...» внутри какого-то чудовищно взломанного вместе запроса, который они просто предпочитают не пытаться распутать, не говоря уже о замене «*» на 100 имен столбцов. Или, может быть, они просто анализируют порядок вещей и им нравится иметь связанные поля рядом друг с другом при просмотре схемы с помощью, скажем, SQL Developer. Возможно, они имеют дело с нетехническим персоналом, который не узнает, что посмотреть в конце списка из 100 столбцов, когда, по логике, это должно быть где-то рядом с началом.
Нет ничего более раздражающего, чем задавать честный вопрос и получать ответ, который говорит: «Вы не должны этого делать». Это моя работа, а не твоя! Пожалуйста, не говорите мне, как делать мою работу. Просто помогите, если сможете. Спасибо!
Хорошо ... извините за напыщенную речь. Теперь ... на www.orafaq.com он предлагает этот обходной путь.
Сначала предположим, что вы уже запустили:
CREATE TABLE tab1 (col1 NUMBER);
Теперь скажите, что вы хотите добавить столбец с именем "col2", но вы хотите, чтобы они упорядочивались "col2", "col1" при выполнении операции "SELECT * FROM tbl1;"
Предлагаем запустить:
ALTER TABLE tab1 ADD (col2 DATE);
ИЗМЕНИТЬ tab1 TO tab1_old;
CREATE TABLE tab1 AS ВЫБРАТЬ 0 AS col1, col1 AS col2 ОТ tab1_old;
Я обнаружил, что это невероятно вводит в заблуждение. Прежде всего, вы заполняете «col1» нулями, поэтому, если у вас есть какие-либо данные, вы теряете их, делая это. Во-вторых, он на самом деле переименовывает «col1» в «col2» и не упоминает об этом. Итак, вот мой пример, надеюсь, он немного понятнее:
Предположим, у вас есть таблица, созданная с помощью следующего оператора:
СОЗДАТЬ ТАБЛИЦУ пользователей (имя-имя varchar (25), имя-имя varchar (25));
Теперь скажите, что вы хотите вставить middle_name между first_name и last_name. Вот один из способов:
пользователи ALTER TABLE ДОБАВЛЯЮТ отчество от имени varchar (25);
Переименовать пользователей в users_tmp;
СОЗДАТЬ ТАБЛИЦУ пользователей, КАК ВЫБРАТЬ first_name, middle_name, last_name FROM users_tmp;
/ * и для хорошей меры ... * /
DROP TABLE testusers_tmp;
Обратите внимание, что middle_name по умолчанию будет иметь значение NULL (подразумевается оператором ALTER TABLE). В качестве альтернативы вы можете установить другое значение по умолчанию в операторе CREATE TABLE, например:
СОЗДАТЬ ТАБЛИЦУ пользователей КАК ВЫБРАТЬ first_name, «некоторое значение по умолчанию» AS middle_name, last_name FROM users_tmp;
Этот прием может пригодиться, если вы добавляете поле даты со значением по умолчанию sysdate, но вы хотите, чтобы все существующие записи имели другое (например, более раннее) значение даты.