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

解決済みの質問

【SQL文】Insert into文で文法エラー

insert into文で思ったような結果がでません。SQL文にお詳しい方、ご教授いただけますでしょうか? SQLは初心者レベルです。

期待している結果:
テーブルT-BBSにT-USRのusr-id全リストを入れて、T-BBSのa,b,cには固定の数値を入れたいと思っています。

テーブル例:
テーブル名:T-BBS ,カラム:usr-id,a,b,c,
テーブル名:T-USR, カラム:usr-id

結果
user-id | a | b | c
2 |1 | 2 | 3
3 |1 | 2 | 3
4 |1 | 2 | 3
7 |1 | 2 | 3

私が考えたSQL文ですが、
INSERT INTO
T-BBS(SELECT user-id FROM T-USR,1,2,3) →×(文法エラー)

INSERT INTO
T-BBS(user-id,a,b,c) VALUES (SELECT user-id FROM T-USR,1,2,3)→×
文法エラー

INSERT INTO
T-BBS(user-id,a,b,c) VALUES ((SELECT user-id FROM T-USR),1,2,3)→×サブクエリが複数行を含んでいる

ちなみにデータベースはH2 Databaseというものみたいですが、mySQLと方言は同じという認識をもってます。

以上宜しくお願いします。

投稿日時 - 2009-10-06 17:49:21

QNo.5346633

困ってます

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

なぜFROMに1,2,3を書いているのでしょうか?

INTO T-BBS
SELECT user-id,1,2,3 FROM T-USR

みたいなのではダメですか?

投稿日時 - 2009-10-06 18:07:07

補足

ご指摘のように前述の1番目、2番目は変に感じます。

イメージ的には、
INSERT INTO
T-BBS(user-id,a,b,c) VALUES ((SELECT user-id FROM T-USR),1,2,3)
みたいにしたいと思っています。(ニュアンスが伝わりますでしょうか?)

また T-USRには a=1,b=2,c=3 のカラムは含んでいません。

投稿日時 - 2009-10-06 20:39:08

お礼

ご回答のお礼をつけ忘れていました。
後述のchukenkenkouさんのご指摘によりyambejpさんの指摘されたやり方でできるのではと思い実行すると思った結果を得ることができました。
 実行確認もせずすいませんでした。またご回答に感謝します。

しかしながらよくわからない点がありまして、
SELECT user-id,1,2,3 FROM T-USR という下りを思うと
T-USRには1,2,3を含んでいないような気がするのですが、含んでいなくてもinsertすることができました。

insertはこういうものだと思うしかないのでしょうか、、、?

投稿日時 - 2009-10-07 08:40:24

ANo.1

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

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

回答(3)

ANo.3

>T-USRには1,2,3を含んでいない

SELECTはたんにテーブルにある値を表示するというものではない
ということを理解した方がいいです。

SELECT 1+1;
SELECT NOW();
など表現できます、この場合FROMさえいりません。
今回のケースだと、1,2,3はスタティックな値ですから、
SELECTのところに直ガキすれば問題ありません。

投稿日時 - 2009-10-07 09:13:17

お礼

ご回答ありがとうございます。

>SELECTはたんにテーブルにある値を表示するというものではない
・・・・なるほど。身にしみました。

select current_timestamp
(現在の日時)
でなぜ表示されるのかも納得です。

重ねてご教授ありがとうございました。

投稿日時 - 2009-10-07 14:21:01

ANo.2

>テーブルT-BBSにT-USRのusr-id全リストを入れて
>ちなみにデータベースはH2 Databaseというものみたいですが、mySQLと方言は同じという認識をもってます。

まず、提示された表名、列名は、実際にテストしているものですか?
「-」は減算と判断されるため、「-」を含む名前を使い場合は、「"」などで囲む必要があります。

「など」としたのは、この部分にMySQLなど一部RDBMSでは、独自仕様があるためです。

標準SQLや主要なRDBMSでは、予約語や特殊記号を含む表名や列名を使いたい場合、「"」(二重引用符)で名前を囲みます。
しかし、MySQLでは「`」(バッククォート)で囲むという仕様です。MySQLでは、「ANSI構文モード」にしてサーバを起動しなければ、「"」(二重引用符)で囲まれたものは、文字定数として扱われます。

SQL Serverなどマイクロソフト製品では、[ ] で囲むといった仕様もあります。

文法エラーとだけ書くのでなく、具体的なエラーメッセージを提示するようにしてください。

MySQLと同じなら、

INSERT INTO `T-BBS`
SELECT `user-id`,1,2,3 FROM `T-USR`

といった記述ではどうでしょうか?

あるいは、MySQLと同じでなく標準SQL準拠なら、

INSERT INTO "T-BBS"
SELECT "user-id",1,2,3 FROM "T-USR"

ではどうでしょうかね?

投稿日時 - 2009-10-06 21:07:47

補足

chukenkenkouさんご回答ありがとうございます。
ご指摘のごとく 実際のテーブル名でありませんでした。
不正確な質問で皆様すいませんでした。
また テーブル名は正確にはT_USR でした。

・mySQLが標準と思っていましたので、ご回答はとても役に立ちました。
>「-」は減算と判断されるため、「-」を含む名前を使い場合は、「"」などで囲む必要があります。

結果的には:INSERT INTO T_BBS SELECT USER_ID,1,2,3 FROM T_USRで
思った結果を得ることができました。

腑に落ちないのは、T_USRには1,2,3をもっていなくてもINSERTできるのだということとです。どういう解釈なのでしょうか?
(SELECT USER_ID,1,2,3 FROM T_USR)・・・こういう塊に見えてしまうのですが、、、

投稿日時 - 2009-10-07 08:44:25

あなたにオススメの質問