Подтвердить что ты не робот

Вставка из SELECT, но изменение одного столбца?

Интересно, есть ли способ вставить строку в таблицу из другой, за исключением одного столбца?

Это, конечно, легко с ограниченным количеством столбцов, но получает вид усталого перечисления всех столбцов, когда число столбцов увеличивается.

Я думаю что-то в строке:

Insert into table
select * replace col1 with current date
from table
where yada yada yada

Одна из возможностей - дублировать одну строку и выполнять и обновлять, но пусть это не опция из-за индекса или чего-то еще.

Любые идеи?

Изменить: Это DB2 v10, но вопрос не из чистого любопытства. Просто интересно, возможно ли это...

4b9b3361

Ответ 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