Firebird SQL для вставки типичной записи из другой таблицы только с одним другим полем - PullRequest
3 голосов
/ 20 июля 2011

работаю на Firebird 2.5 и у меня есть две таблицы, все их столбцы похожи, за исключением того, что у одного есть первичный ключ с автоматическим приращением и ненулевое поле внешнего ключа (A) для основной таблицы

Я знаю, что могу использовать sql для вставки всех значений из двух таблиц

 insert into table1 select * from table2 where somthing = 'foo'

а как насчет поля (A), есть ли способ вставить это значение вручную в тот же оператор SQL? так как это единственное поле, которое необходимо ввести вручную

Спасибо

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Вы можете указать поля источника и цели явно (и вы должны ; не используйте select *, если у вас нет особых причин для этого):

insert into table1
(
    col1,
    col2,
    col3,
    col4
)
select
    col1,
    col2,
    col3,
    'foo'

from table2

where something = 'foo'
2 голосов
/ 23 января 2017

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

Пройдя некоторое время по поиску, я нашел решение:

   select cast(list(trim(RDB$FIELD_NAME)) as varchar(10000))
      from RDB$RELATION_FIELDS 
      where RDB$RELATION_NAME = 'YOUR_TABLE' 
         and RDB$FIELD_NAME not in ('ID') -- include other fields to NOT copy
   into :FIELD_NAMES;

   NEW_ID = next value for YOUR_TABLE_ID_GENERATOR;

   execute statement '
      insert into YOUR_TABLE (ID,' || FIELD_NAMES || ')
      select ' || cast(:NEW_ID as varchar(20)) || ',' ||
         FIELD_NAMES || '
         from YOUR_TABLE
         where ID = ' || cast(:ID_OF_RECORD_TO_COPY as varchar(20));

Надеюсь, это сэкономит время для всех, кто сталкивается с этой проблемой!

...