2016-10-18 3 views

答えて

3

あなたがすべて1つのステートメントでこれをしたい場合は、CTEを使用することができます。

with foo as (
     select * from ... 
    ), 
    b as (
     insert into bar 
      select * from foo 
      returning * 
    ) 
insert into baz 
    select * from foo; 

注:

  • あなたはinsertでカラムリストを含める必要があります。
  • select *には、列名を明示的にと指定する必要があります。 2つのテーブルで列が一致しない可能性があるため、これは重要です。
  • 私は常にreturningupdate/insert/deleteをCTEで使用しています。これは通常の使用例です。たとえば、シリアルIDを挿入物から取得することができます。
0

with条項の範囲は1つだけのクエリです。私が考えることができる唯一の解決策は、ビューを作成し、挿入が完了したらそれをドロップすることです。これは、CTEのように完全に短命ではありませんが、ここではデータの重複ありません - ちょうど(比較的)安価なDDL操作は:

-- Create the view 
CREATE VIEW foo AS SELECT * FROM ...; 

-- Perform the inserts 
INSERT INTO bar SELECT * FROM foo; 
INSERT INTO baz SELECT * FROM foo; 

-- Drop the view when you're done 
DROP VIEW foo; 
+0

これは、(一時的な)ビューを必要とせず、単一のCTEで行うことができます。 –

関連する問題