2011-07-20 6 views
3

私はFirebird 2.5 で作業し、2つのテーブルを持っています。マスターテーブルFirebird sqlは1つの異なるフィールドからの典型的なレコードを挿入する

ためのフィールド(A)私は二つのテーブル

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

からすべての値を挿入するには、このようなSQLを使用することができます知っているが、どのようなフィールド(A)については、この値を挿入する方法があります手動で同じSQLステートメントで?これが唯一のフィールドであるように手動

おかげ

答えて

5

を入力する必要が明示的にソースとターゲットフィールドの両方を指定することができます(そして、あなたべき;あなたがに特別な理由がない限り、select *を使用しないでください) :私は同じことを行うためのソリューションを探していましたので、

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

from table2 

where something = 'foo' 
2

はこの記事に出くわしましたが、フィールド名をハードコーディングせずにフィールドが多分追加/削除および更新することを忘れないようにしたくなかったので、コピー記録手順。

しばらく周りグーグルの後、私はこの解決策を考え出した:

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)); 

希望がこの問題に出くわす他の誰のためにいくつかの時間を節約できます!

関連する問題