1. ホーム
  2. tsql

[解決済み] INSERT INTOとWITH/CTEを組み合わせる

2022-04-17 07:10:27

質問

非常に複雑なCTEがあり、その結果を物理テーブルに挿入したいのですが、どうすればよいですか?

以下は有効ですか?

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID,
    AccountNo,
    APartyNo,
    SourceRowID
)       
WITH tab (
  -- some query
)    
SELECT * FROM tab

このCTEを作成するために、再利用を可能にする関数を使用しようと考えています。何かご意見はありますか?

どのように解決するのですか?

CTEを先に記述し、INSERT INTOをselect文と組み合わせる必要があります。また、CTE名の後に続く"AS"キーワードはオプションではありません。

WITH tab AS (
    bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)  
SELECT * FROM tab

このコードは、CTEがちょうど4つのフィールドを返し、それらのフィールドがINSERT文に指定されたものと順序と型が一致することを想定していることに注意してください。 そうでない場合は、"SELECT *"を、必要なフィールドの特定の選択に置き換えるだけです。

関数の使用に関するご質問ですが、「場合による」とお答えします。 もし、パフォーマンス上の理由からテーブルにデータを置くのであれば、関数を通して使っても速度に問題がないのであれば、関数を選択肢に入れるといいと思います。 一方、CTEの結果を複数の異なるクエリで使用する必要があり、速度がすでに問題になっている場合は、テーブル(通常のテーブル、またはtempテーブル)を使用します。

WITH common_table_expression(トランザクトSQL)