こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

insert into select で別テーブルのID分挿入したい

SQLでこんなことは可能でしょうか。

列 IDとTEXT をもつテーブルA と、
列 IDをもつテーブルBがあります。


テーブルAに、テーブルBのID分のデータを挿入したいです。
TEXTはテーブルAのID=1のTEXTデータを全ての列に挿入します。
このような場合のSQL文を調べてるのですが、
なかなかわからなくて困っています。

insert into select b.id,a.text from tableA as a, tableB as b

でもうまくいきませんでした。

何かいい方法はないでしょうか?
回答お待ちしております。

投稿日時 - 2007-03-30 10:55:11

QNo.2878799

すぐに回答ほしいです

質問者が選んだベストアンサー

#2、#5回答者です。

SQL Serverのバージョンは、何でしょうか?

#2、#5で提示したSQL中の
「select ~ from(select ~ from ~)」
という記述は、標準SQLでも規定され、多くのRDBMSでもインラインビューといった機能名で実装されていますが、SQL Serverでは2005で実装されたらしいことが分かりました。

そのため、やってること(=質問者さんがやりたいことを推測したもの)の確認とSQL Server 2000でも実行可能なSQLを改めて提示します。
SQL Server 2005では、前回提示のSQLで、そのまま動くと思います。

1.提示された条件→こちらでの解釈
(1)表Aには、ID列とTEXT列がある。
(2)表Bには、ID列がある。
(3)表Aに表Bの全行を追加。この時、TEXT列には、表AのID=1の行のTEXT列の値を格納。
→表AのID=1で行を絞り込めるとのことから、列IDはユニークと推測しています。

2.やりたいことの推測
表A
ID TEXT
1 a
2 b
3 c

表B
ID
4
5
6

得たい結果(表A)
ID TEXT
1 a
2 b
3 c
4 a
5 a
6 a

3.SQL例
 ※列TEXTはTXTと変えています。
(1)SQL Server 2000でのSQL例
insert into A
select B.ID,A.TXT from A,B where A.ID=1;

(2)SQL Server 2005でのSQL例
(1)または、以下のような記述も可能

insert into A
select id,txt from (select txt from A where id=1) as x,B

投稿日時 - 2007-04-07 00:12:40

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

#2回答者です。

標準的なSQLの構文、意味を知らない人がいるようなので、解説します。

(1)表の列構成
列 IDとTEXT をもつテーブルA と、
列 IDをもつテーブルBがあります。

(2)格納方法
テーブルAに、テーブルBのID分のデータを挿入したいです。

insert into A
select id,txt from ( ~ ) as x,B

テーブルBのID分だから、Bと()内の検索結果(テーブルAをID=1で絞り込んだ1件)を直積しています。

TEXTはテーブルAのID=1のTEXTデータを全ての列に挿入します

select txt from A where id=1
で取り出します。

これを組み立てると、以下のSQLになります。

insert into A
select id,txt from (select txt from A where id=1) as x,B

投稿日時 - 2007-03-31 18:14:53

ANo.3

・単純にTableAへ挿入
INSERT A
SELECT id, text
 FROM B
WHERE id = 1

・重複を除いて挿入
INSERT A
SELECT DISTINCT id,text
 FROM B
WHERE id = 1

・「ID=1のTEXTデータを全ての列に挿入」を踏まえて、「id=1のtext値をすべての行に更新」と解釈して
UPDATE A
 SET text = (SELECT b.text FROM b WHERE b.id = 1)

投稿日時 - 2007-03-31 09:50:29

お礼

ありがとうざいました。おかげで解決です。

投稿日時 - 2007-04-09 10:12:44

ANo.2

文章だけでの説明では分かりにくいので、基の表と得たい結果を明示するといいですよ。

>insert into select b.id,a.text from tableA as a, tableB as b

insertの構文自体間違っているし、質問内容と合っていませんが?

>でもうまくいきませんでした。

具体的に、どううまく行かなかったのかを書きましょう。
文法エラーになるとか、期待した結果と違うといったことと、具体的な内容を書きましょう。

やりたいことを推測すると、以下のようなSQLでしょうかね?

insert into A
select id,txt from (select txt from A where id=1) as x,B

投稿日時 - 2007-03-30 17:16:05

お礼

次回から、ご指摘いただいたことに注意して質問したいと思います。
ありがとうございました。
解決いたしました。

投稿日時 - 2007-04-09 10:11:18

ANo.1

補足をお願いします。

tableA
-----------------
ID TEXT
1 a
2 b
3 c

tableB
-----------------
ID
1
2
3

tableB.ID をtableAのどこのフィールドに入れたいのですか?
tableA.ID とtableB.IDに関連付けたいのか?tableA.TEXT とtableB.IDに関連付けたいのか?どっちですか?

投稿日時 - 2007-03-30 11:44:21

お礼

tableB.ID分だけtableA.IDに挿入したいということです。
その際に、tableA.TEXTに入れるのは、
tableA.IDが1のTEXTを入れるということをしたいです。

投稿日時 - 2007-04-09 10:09:06

あなたにオススメの質問