web-dev-qa-db-ja.com

INSERT INTO ... SELECT ... FROMの列を自動的に照合します

SQLServerの質問。するとき

INSERT INTO T1 SELECT (C1, C2) FROM T2

T1と同じであるため、T2の列名を指定したくありません。

そうすることは可能ですか?

現在、エラーが発生しています

メッセージ213、レベル16、状態1、行1

列名または指定された値の数がテーブル定義と一致しません。

12

T1T2が完全に一致する場合、2つの選択肢があります。 T2のすべての列をinsert into T1からselectするか、insertステートメントに列リストを指定することができます。

selectを実行すると、MSSQLは列ヘッダーを提供しますが、その情報はinsertステートメントによって列を照合するために使用されません。

3
Donnie

INSERTプロジェクションとSELECTプロジェクションの両方で常に明示的な列を使用してください。したくない場合でも、次のことを行う必要があります。

INSERT INTO T1 (C1, c2)
SELECT C1, C2 FROM T2
18
Remus Rusanu

はい、挿入先のテーブルのフィールド名を省略できます。また、select *を使用してテーブルからすべてのフィールドを取得できますが、このアプローチはお勧めしません。

フィールド名を省略すると、フィールドは名前ではなく位置で照合されます。フィールドが完全に同じ順序でない場合、それらは混同されます。一般に、テーブルの変更がクエリを壊すリスクを最小限に抑えるために、テーブルの正確なレイアウトに依存することは避けてください。

14
Guffa

なぜ単純ではないのですか

INSERT INTO t1
SELECT * FROM T2
1
Sparky

最初にこの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 
0
ehuehu

列名が心配な場合は、いつでもエイリアスを付けることができます。

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

こんなに簡単な例でなぜそうしたいのか、私にはよくわかりませんが

0
leepowers