SQLServerの質問。するとき
INSERT INTO T1 SELECT (C1, C2) FROM T2
T1
と同じであるため、T2
の列名を指定したくありません。
そうすることは可能ですか?
現在、エラーが発生しています
メッセージ213、レベル16、状態1、行1
列名または指定された値の数がテーブル定義と一致しません。
T1
とT2
が完全に一致する場合、2つの選択肢があります。 T2
のすべての列をinsert into T1
からselect
するか、insert
ステートメントに列リストを指定することができます。
select
を実行すると、MSSQLは列ヘッダーを提供しますが、その情報はinsert
ステートメントによって列を照合するために使用されません。
INSERTプロジェクションとSELECTプロジェクションの両方で常に明示的な列を使用してください。したくない場合でも、次のことを行う必要があります。
INSERT INTO T1 (C1, c2)
SELECT C1, C2 FROM T2
はい、挿入先のテーブルのフィールド名を省略できます。また、select *を使用してテーブルからすべてのフィールドを取得できますが、このアプローチはお勧めしません。
フィールド名を省略すると、フィールドは名前ではなく位置で照合されます。フィールドが完全に同じ順序でない場合、それらは混同されます。一般に、テーブルの変更がクエリを壊すリスクを最小限に抑えるために、テーブルの正確なレイアウトに依存することは避けてください。
なぜ単純ではないのですか
INSERT INTO t1
SELECT * FROM T2
最初にこのSQLを選択し、SQLの結果からテーブル行を選択して、ターゲットまたはソースのテーブル名を変更します。テーブルに同じ列がある場合(同じ順序は必要ありません)、それは機能します。
with xparams as(select(select user from dual) "OWNER"、 '' "ADDSTRTOFROMTABLENAME" from dual) 、t1 as(SELECT dbat.table_name from dba_tables dbat、xparams where dbat.owner = xparams.OWNER) 、t1c1 as(SELECT utcs.table_name、LISTAGG(utcs.column_name、 '、')in group(order by utcs.column_name) "COLS" from USER_TAB_COLUMNS utcs、t1 where utcs.table_name = t1.table_name group by utcs.table_name) 、res1 as(SELECT'insert into '|| t1c1.table_name ||'( '|| t1c1.COLS ||')select '|| t1c1.COLS || 'from' || t1c1.table_name || xparams.ADDSTRTOFROMTABLENAME || ';' "RES" from t1c1、xparams order by t1c1.table_name) select * from res1
列名が心配な場合は、いつでもエイリアスを付けることができます。
INSERT INTO T1 (C1, c2)
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2
または、より簡潔に:
INSERT INTO T1 (C1, c2)
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2
こんなに簡単な例でなぜそうしたいのか、私にはよくわかりませんが