Вставка из SELECT, но изменение одного столбца?
Интересно, есть ли способ вставить строку в таблицу из другой, за исключением одного столбца?
Это, конечно, легко с ограниченным количеством столбцов, но получает вид усталого перечисления всех столбцов, когда число столбцов увеличивается.
Я думаю что-то в строке:
Insert into table
select * replace col1 with current date
from table
where yada yada yada
Одна из возможностей - дублировать одну строку и выполнять и обновлять, но пусть это не опция из-за индекса или чего-то еще.
Любые идеи?
Изменить:
Это DB2 v10, но вопрос не из чистого любопытства.
Просто интересно, возможно ли это...
Ответы
Ответ 1
с использованием Oracle
DECLARE
CURSOR CUR_D IS
SELECT *
FROM TABLE
WHERE id = some id;
ROW_D CUR_D%ROWTYPE;
BEGIN
OPEN CUR_D;
FETCH CUR_D INTO ROW_D;
CLOSE CUR_D;
ROW_D.column := 'some data';
INSERT INTO some table
VALUES ROW_D;
END;
/
Ответ 2
Для SQL Server синтаксис будет выглядеть следующим образом:
insert into TargetTable
(col1, col2, col3, ...)
select getdate(), col2, col3, ...
from SourceTable
SQL Server может создать список столбцов для вас. Щелкните правой кнопкой мыши имя таблицы и выберите Script as -> Select -> To New Window
.
Ответ 3
Вы можете использовать временные таблицы
Создать временную таблицу
CREATE TEMPORARY TABLE temp_table AS (SELECT * FROM MyTable WHERE ...);
Обновить столбец
UPDATE temp_table SET column='Value' WHERE ...;
Или удалить столбец
ALTER TABLE temp_table DROP column_name;
Вставить в таблицу адресатов
INSERT INTO MyDestinationTable SELECT * FROM temp_table;
Ответ 4
Создайте VIEW с нужным номером для столбцов.
Предположим, что Tbl1 имеет 4 столбца. Создайте представление с необходимыми столбцами. Здесь Col1 исключен.
CREATE VIEW V1 AS
SELECT col2, col3, col4
FROM TBL1
Используйте VIEW для вставки. Значение Col1 для TBL2 будет текущей датой, для других столбцов значения будут отображаться из вида V1, то есть col2, col3, col4 из TBL1
INSERT INTO TBL2
SELECT GETDATE(), *
FROM V1
Таким образом вам не нужно указывать все столбцы каждый раз.
Надеюсь, что это поможет
Ответ 5
предполагая, что ваш выбор имеет атрибуты, однозначно определяющие набор результатов по отношению к содержимому вашей целевой таблицы перед вставкой, вы можете применить следующие два шага:
Insert into target_table
select *
from source_table
where yada yada yada
and characteristic_yada
;
update target_table
set col1 = current date
where characteristic_yada
;
commit;
обязательно произведите обе команды внутри той же транзакции, что и показано. также следует помнить, что characteristic_yada
должен быть применим как к исходной, так и к целевой таблице и что соответствие characteristic_yada
должно быть проверено перед каждым приложением операторов, если они не относятся к pks/aks таблицы taregt