2016-04-12 31 views
0

3つの新しい列を追加する新しいバージョンのテーブルを作成しています。ここに私のINSERTクエリは次のとおりです。特定の条件に基づいて新しい値を挿入する

INSERT INTO test_db.new_item 
SELECT A.*,'I','2010-02-01','9999-12-31' FROM db.item A WHERE ACTV_FLG = 'Y' 
SELECT B.*,'U','2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1) FROM db.item B WHERE ACTV_FLG = 'N' 
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),'9999-12-31' FROM db.item C WHERE ACTV_FLG = 'N'; 

私は古いものを加えた私がしたい3つの新しい列と同じ列を持つ新しいテーブルを作成しました。この挿入は、既存のデータを必要な形式に変換するための一度だけのクエリです。ACTV_FLGYであるかどうかを確認し、特定の値を挿入してACTV_FLGNであるかどうかをチェックし、データの履歴を保持する。その特定のケースでは、元の行を保持するために、削除の現在の状態を示すコピーを作成します。

私はUNIONにしようとするとエラーになります。これらの選択ステートメントを他の方法で組み合わせることはできますか?

+0

私はあなたがnew_itemテーブルにあるより多くの列を挿入していると仮定します。 –

+0

いいえ、new_itemテーブルには必要なすべての新しい列がありますが、それらの列はNOT NULLなので、データでそれらを埋める必要があります。 – Saliceran

+0

正確なエラーメッセージは何ですか?列の値は異なるデータ型ですか? –

答えて

1

UNIONを試したときに表示されるエラーはおそらく3654. Corresponding select-list expressions are incompatibleです。

VARCHARとDATEを組み合わせようとすると、'2010-02-01'はDATEのように見えるかもしれませんが、VARCHARです。 DATE '2010-02-01'

INSERT INTO test_db.new_item 
SELECT A.*,'I',DATE '2010-02-01', DATE '9999-12-31' 
FROM db.item A WHERE ACTV_FLG = 'Y' 
UNION ALL 
SELECT B.*,'U',DATE '2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1) 
FROM db.item B WHERE ACTV_FLG = 'N' 
UNION ALL 
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),DATE '9999-12-31' 
FROM db.item C WHERE ACTV_FLG = 'N'; 

しかし、あなたはあなたの既存の3つの挿入を維持し、Teradataのモードのセッションでは、単一のトランザクションで複数ステートメントリクエスト、としてそれらを実行する可能性があります代わりに日付リテラルを使用してください。 SQLアシスタントでは、F5の代わりにF9(Teradata Studioで似ているはずです)とBTEQでセミコロンの位置に基づいています(新しいコマンドが前のコマンドのセミコロンの後に同じ行で始まる場合)。

SELECT A.*,'I',DATE '2010-02-01', DATE '9999-12-31' 
FROM db.item A WHERE ACTV_FLG = 'Y' 
;INSERT INTO test_db.new_item 
SELECT B.*,'U',DATE '2010-02-01',(CAST(LAST_UPD_TS AS DATE) - 1) 
FROM db.item B WHERE ACTV_FLG = 'N' 
;INSERT INTO test_db.new_item 
SELECT C.*,'D',CAST(LAST_UPD_TS AS DATE),DATE '9999-12-31' 
FROM db.item C WHERE ACTV_FLG = 'N' 
; 
+0

DATEリテラルを使用すると、そのトリックが実行されました。本当にありがとう! – Saliceran

関連する問題